6 votos

La mejor manera de comprobar en bash if Herramientas de Línea de Comandos están instalados?

Usando bash, quiero comprobar si las Herramientas de Línea de Comandos están instalados.

En la actualidad son y cuando voy a tipo xcode-select --install de recibir:

xcode-seleccione: error: herramientas de línea de comandos ya están instalados, uso "Actualización de Software" para instalar las actualizaciones aparece Homebrew ya está instalado. Si su intención es volver a instalar debe hacer... bla bla bla

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

1) puedo hacer xcode-select -p y que devuelve la ruta de acceso /Library/Developer/CommandLineTools pero entonces, ¿cómo debo construir la if declaración? Yo no sé qué va a ser presentado en el momento de CLT no están instalados.

2) que puedo hacer xcode-select --version. Debo, a continuación, grep de una frase en version ya que me da

xcode-seleccione la versión 2343.

3) que puedo hacer which xcode-select pero, de nuevo, en todos los casos no estoy seguro de cómo la if debe ser similar. También creo que el grep no es la mejor manera, ya que en el futuro el resultado puede ser diferente en el futuro la versión de OSX.

En resumen me gustaría algo como

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

Gracias por cualquier sugerencia.

10voto

Rich Puntos 2429
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 las viejas versiones de Xcode, pero está trabajando como -print-path. Por otro lado, el -p opción no tener esta compatibilidad.

5voto

siva Puntos 23

Sólo porque el código-select devuelve una ruta de acceso válida no significa que las herramientas de línea de comandos están instalados:

$ 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, un control más exacto es el uso de xcode-seleccionar e 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, se le pedirá para su instalación como su ejemplo se muestra, pero sin una línea separada para el xcode-select --install.

1voto

Michael Zhou Puntos 167

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X