¿La mejor manera de verificar en bash si las herramientas de línea de comandos están instaladas?

4

Usando bash, quiero verificar si las herramientas de línea de comandos están instaladas.

Actualmente son y cuando escribo xcode-select --install , obtengo:

  

xcode-select: error: las herramientas de línea de comandos ya están instaladas, use   "Actualización de software" para instalar actualizaciones Parece que Homebrew ya está   instalado. Si tu intención es reinstalar, debes hacer ... bla bla   bla

Básicamente, mi problema es que tengo varios métodos para verificar en bash (usando if / fi ) pero no sé qué solución es la mejor.

1) Puedo hacer xcode-select -p y eso devuelve la ruta /Library/Developer/CommandLineTools , pero ¿cómo debo construir la declaración if ? No sé qué se presentará cuando CLT no esté instalado.

2) Puedo hacer xcode-select --version . ¿Debería entonces grep para una frase version desde que obtengo

  

xcode-select version 2343.

3) Puedo hacer which xcode-select pero, de nuevo, en todos los casos no estoy seguro de cómo debería verse if . También creo que grep no es la mejor manera, ya que en el futuro la salida puede ser diferente en la versión futura de OSX.

Para resumir, me gustaría algo como

#!/bin/bash
if [ no idea ]; then
    #installed, nothing to do...
else
    xcode-select --install
fi

Gracias por cualquier sugerencia.

    
pregunta Matt 14.12.2015 - 09:49

3 respuestas

6
if type xcode-select >&- && xpath=$( xcode-select --print-path ) &&
   test -d "${xpath}" && test -x "${xpath}" ; then
   #... is correctly installed
else
   #... isn't correctly installed
fi

Extrañamente, el --print-path no está documentado en versiones antiguas de Xcode pero funciona como -print-path . Por otro lado, la opción -p no lo hace tener esta compatibilidad.

    
respondido por el daniel Azuelos 14.12.2015 - 10:10
3

El hecho de que la selección de código devuelva una ruta válida no significa que las herramientas de la línea de comandos estén instaladas:

$ xcode-select -p
/Applications/Xcode.app/Contents/Developer
$ if type xcode-select >&- && xpath=$( xcode-select --print-path ) &&
    test -d "${xpath}" && test -x "${xpath}" ; then echo "installed" ; fi
installed
$ xcode-select --install
xcode-select: note: install requested for command line developer tools

Por lo tanto, una comprobación más precisa es usar xcode-select para intentar instalar el CLT con lo siguiente:

if xcode-select --install 2>&1 | grep installed; then
  echo installed;
else
  echo not installed, installing;
fi

Si no está instalado, solicitará la instalación como muestra su ejemplo, pero sin una línea separada para el xcode-select --install .

    
respondido por el grg 14.12.2015 - 18:15
1

Otro enfoque sería utilizar pkgutil

if      pkgutil --pkg-info com.apple.pkg.CLTools_Executables >/dev/null 2>&1
then    printf '%s\n' "CHECKING INSTALLATION"
        count=0
        pkgutil --files com.apple.pkg.CLTools_Executables |
        while IFS= read file
        do
        test -e  "/${file}"         &&
        printf '%s\n' "/${file}…OK" ||
        { printf '%s\n' "/${file}…MISSING"; ((count++)); }
        done
        if      (( count > 0 ))
        then    printf '%s\n' "Command Line Tools are not installed properly"
                # Provide instructions to remove and the CommandLineTools directory
                # and the package receipt then install instructions
        else    printf '%s\n' "Command Line Tools are installed"
        fi
else   printf '%s\n' "Command Line Tools are not installed"
       # Provide instructions to install the Command Line Tools
fi
    
respondido por el fd0 15.12.2015 - 16:58

Lea otras preguntas en las etiquetas