Il modo migliore per verificare in bash se sono installati gli strumenti della riga di comando?

4

Usando bash, voglio controllare se gli strumenti della riga di comando sono installati.

Attualmente sono e quando digito xcode-select --install ottengo:

xcode-select: error: command line tools are already installed, use "Software Update" to install updates It appears Homebrew is already installed. If your intent is to reinstall you should do... blah blah blah

Fondamentalmente il mio problema è che ho diversi metodi per controllare in bash (usando if / fi ) ma non so quale sia la soluzione migliore.

1) Posso fare xcode-select -p e questo restituisce il percorso /Library/Developer/CommandLineTools , ma come dovrei creare l'istruzione if ? Non so cosa verrà presentato quando CLT non è installato.

2) Posso fare xcode-select --version . Dovrei quindi grep per una frase version da quando ottengo

xcode-select version 2343.

3) Posso fare which xcode-select ma, di nuovo, in tutti i casi non sono sicuro di come dovrebbe apparire if . Penso anche che grep non sia il modo migliore, dal momento che in futuro l'output potrebbe essere diverso nella versione futura di OSX.

Per riassumere vorrei qualcosa come

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

Grazie per eventuali suggerimenti.

    
posta Matt Komarnicki 14.12.2015 - 09:49
fonte

3 risposte

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

Stranamente, --print-path non è documentato nelle vecchie versioni di Xcode, ma funziona come -print-path . D'altra parte, l'opzione -p no avere questa compatibilità.

    
risposta data 14.12.2015 - 10:10
fonte
3

Proprio perché la selezione del codice restituisce un percorso valido non significa che gli strumenti della riga di comando siano installati:

$ 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

Quindi, un controllo più accurato è usare xcode-select per provare e installare il CLT con il seguente:

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

Se non è installato, richiederà l'installazione come mostra il tuo esempio, ma senza una riga separata per xcode-select --install .

    
risposta data 14.12.2015 - 18:15
fonte
1

Ancora un altro approccio sarebbe utilizzare 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
    
risposta data 15.12.2015 - 16:58
fonte

Leggi altre domande sui tag