6 votes

Quelle est la meilleure façon de vérifier dans bash si les outils de ligne de commande sont installés ?

En utilisant bash, je veux vérifier si les outils de ligne de commande sont installés.

Actuellement ils sont et lorsque je tape xcode-select --install Je reçois :

xcode-select : error : command line tools are already installed, use "Software Update" pour installer les mises à jour Il semble que Homebrew soit déjà installé. Si votre intention est de réinstaller, vous devriez faire... blah blah bla

En fait, mon problème est que j'ai plusieurs méthodes pour vérifier dans bash (en utilisant if / fi ) mais je ne sais pas quelle est la meilleure solution.

1) Je peux faire xcode-select -p et qui renvoie le chemin /Library/Developer/CommandLineTools mais alors comment je dois construire le if déclaration ? Je ne sais pas ce qui sera présenté lorsque les CLT ne seront pas installés.

2) Je peux faire xcode-select --version . Dois-je alors grep pour une phrase version puisque je reçois

xcode-select version 2343.

3) Je peux faire which xcode-select mais encore une fois, dans tous les cas, je ne suis pas sûr de savoir comment le if devrait ressembler à ceci. Je pense également que grep n'est pas la meilleure solution, car à l'avenir, la sortie pourrait être différente dans les versions futures d'OSX.

En résumé, je voudrais quelque chose comme

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

Merci de vos suggestions.

10voto

Rich Points 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

Curieusement, le --print-path n'est pas documenté dans les anciennes versions de Xcode mais fonctionne comme -print-path . D'autre part, le -p l'option ne n'a pas cette compatibilité.

5voto

grg Points 181593

Ce n'est pas parce que code-select renvoie un chemin d'accès valide que les outils de ligne de commande sont installés :

$ 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

Ainsi, une vérification plus précise consiste à utiliser xcode-select pour essayer d'installer le CLT avec ce qui suit :

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

S'il n'est pas installé, il vous demandera de l'installer comme dans votre exemple, mais sans ligne distincte pour l'option xcode-select --install .

1voto

Michael Zhou Points 167

Une autre approche consisterait à utiliser 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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X