Cara terbaik untuk memeriksa di bash jika Alat Baris Perintah diinstal?

4

Menggunakan bash, saya ingin memeriksa apakah Alat Baris Perintah diinstal.

Saat ini mereka dan ketika saya mengetik xcode-select --installsaya mendapatkan:

xcode-select: error: alat-alat baris perintah sudah diinstal, gunakan "Pembaruan Perangkat Lunak" untuk menginstal pembaruan Tampaknya Homebrew sudah diinstal. Jika niat Anda adalah menginstal ulang, Anda harus melakukan ... bla bla bla

Pada dasarnya masalah saya adalah bahwa saya memiliki beberapa metode untuk check in bash (menggunakan if / fi) tetapi saya tidak tahu solusi mana yang terbaik.

1) Saya bisa lakukan xcode-select -pdan itu mengembalikan jalur /Library/Developer/CommandLineToolstetapi kemudian bagaimana saya harus membangun ifpernyataan? Saya tidak tahu apa yang akan disajikan ketika CLT tidak diinstal.

2) Saya bisa melakukannya xcode-select --version. Haruskah saya grepkarena frase versionsejak saya dapatkan

xcode-pilih versi 2343.

3) Saya dapat melakukan which xcode-selecttetapi sekali lagi, dalam semua kasus saya tidak yakin bagaimana ifseharusnya. Saya juga berpikir itu grepbukan cara terbaik, karena di masa depan output mungkin berbeda di versi OSX di masa depan.

Singkatnya saya ingin sesuatu seperti

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

Terima kasih atas sarannya.

Matt Komarnicki
sumber

Jawaban:

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

Anehnya, --print-pathini tidak didokumentasikan dalam versi Xcode lama tetapi berfungsi sebagai -print-path. Di sisi lain, -popsi tidak memiliki kompatibilitas ini.

dan
sumber
Itu sempurna. Jadi saya melewatkan itu -x. Daniel terima kasih. Saya melihat bahwa mengganti -print-pathdengan hanya -pberfungsi juga.
Matt Komarnicki
Bergantung pada kualitas pemeriksaan yang ingin Anda capai, a type xcode-selectdan a -dbisa diperlukan.
dan
Saya akan menggunakan:if [ -d "$(xcode-select -p)" ]; then
user3439894
1
Dengan bantuan komentar @ user3439894, saya taruh di sini atau lebih umum cek shell dari Xcodepemasangan yang benar.
dan
1
Tidak ${xpath}boleh dua kali dikutip untuk mencegah globbing dan pemisahan kata? Juga, mengapa Anda menempatkan ruang xcode-select --print-pathdi sekitar $( xcode-select --print-path )? Tidak perlu dan harus hanya:$(xcode-select --print-path)
user3439894
4

Hanya karena pemilihan kode mengembalikan jalur yang valid tidak berarti alat baris perintah diinstal:

$ 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

Dengan demikian, pemeriksaan yang lebih akurat adalah dengan menggunakan xcode-select untuk mencoba dan menginstal CLT dengan yang berikut:

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

Jika tidak diinstal, itu akan meminta instalasi seperti yang ditunjukkan contoh Anda, tetapi tanpa baris terpisah untuk xcode-select --install.

GRG
sumber
Apakah kode pertama yang Anda jalankan konsekuensi dari 1 xcode-select --installdiikuti dengan perpindahan Xcodejalur terdaftar xcode-select --switch /tmp?
dan
Di macOS Sierra 10.12.2, jika CLT sudah diinstal akan xcode-select --install 2>&1menghasilkan stderr :, xcode-select: error: command line tools are already installed, use "Software Update" to install updatestetapi Anda tidak ingin menekannya untuk kasing yang tidak terpasang. Saya bingung.
Lloyd Dewolf
@ fd0 sepertinya cara untuk pergi. Pada Sierra MacOS 10.12.1 yang bersih: ENTER: $ pkgutil --pkg-info = com.apple.pkg.CLTools_Executables HASIL: Tidak ada tanda terima untuk 'com.apple.pkg.CLTools_Executables' ditemukan di '/'. ENTER: $ echo $? HASIL: 1
Lloyd Dewolf
1

Namun pendekatan lain akan digunakan 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
fd0
sumber
Saya mencari di dalam kode sumber homebrew dan Homebrew/os/mac/xcode.rbsepertinya menggunakan jenis pendekatan ini. Melihat homebrew menarik bagi saya karena saya dapat melihat evolusi integrasi CLT di MacOS.
Lloyd Dewolf