GNU/Linux >> Belajar Linux >  >> Linux

Cara Terbaik Mendeteksi (dari Skrip) Apakah Perangkat Lunak Sudah Diinstal?

Saya pernah frustrasi sebelumnya dengan perbedaan output dari which perintah di berbagai platform (Linux vs. Solaris vx. OS X), dengan shell yang berbeda mungkin juga berperan dalam masalah ini. type telah disarankan sebagai alternatif yang lebih baik, tetapi seberapa portabel itu?

Di masa lalu saya telah menulis fungsi yang mengurai output dari which dan menangani berbagai kasus penggunaan yang saya alami. Mereka bekerja di seluruh mesin yang saya gunakan, dan begitu juga untuk skrip pribadi saya, tetapi ini tampaknya sangat tidak dapat diandalkan untuk perangkat lunak yang akan saya posting di suatu tempat untuk digunakan orang lain.

Untuk mengambil hanya satu contoh yang mungkin, misalkan saya harus mendeteksi dari skrip apakah bash dan zsh tersedia di mesin, dan kemudian menjalankan perintah dengan zsh jika ada, dan dengan bash jika zsh tidak dan bash cukup versi untuk tidak memiliki bug tertentu. Sebagian besar skrip lainnya dapat berupa Bourne shell atau Ruby atau apa pun, tetapi satu hal khusus ini harus dilakukan (AFAIK) dengan zsh atau versi bash terbaru.

Dapatkah saya mengandalkan type yang tersedia di seluruh platform? Apakah ada alternatif lain untuk which yang dapat dengan mudah dan konsisten menjawab pertanyaan apakah perangkat lunak tertentu diinstal?

(Jika Anda juga ingin memberikan ide yang secara khusus terkait dengan contoh yang saya berikan, itu bagus, tetapi saya terutama hanya bertanya tentang kasus umum:apa cara paling andal untuk mengetahui apakah suatu hal tertentu diinstal pada mesin tertentu ?)

Jawaban yang Diterima:

Di abad ke-21, terutama jika Anda menargetkan mesin yang cenderung memiliki bash atau zsh, Anda dapat mengandalkan type tersedia. (Itu tidak ada di unice yang sangat tua, seperti, dari tahun 1970-an atau awal 1980-an.) Anda tidak dapat mengandalkan outputnya yang berarti apa pun, tetapi Anda dapat mengandalkan pengembaliannya 0 jika ada perintah dengan nama itu dan bukan nol sebaliknya.

which tidak standar dan tidak dapat diandalkan dalam praktiknya. type merupakan alternatif yang direkomendasikan. whereis menderita masalah yang sama dengan which dan kurang umum. whence khusus untuk ksh dan zsh.

Jika memungkinkan, akan lebih dapat diandalkan untuk menguji keberadaan perintah dan menguji apakah perilakunya terlihat masuk akal. Misalnya, uji keberadaan versi bash yang sesuai dengan menjalankan bash -c 'somecommand' , misalnya

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …

Hari ini Anda dapat mengandalkan hampir semua hal dalam spesifikasi Singe UNIX versi 2 (kecuali untuk hal-hal eksotis seperti Fortran dan SCCS, yang bagaimanapun juga opsional). Anda juga dapat mengandalkan sebagian besar versi 3, tetapi ini belum sepenuhnya diterapkan di semua tempat. Dukungan versi 4 lebih samar. Jika Anda akan membaca spesifikasi ini, saya sarankan untuk membaca versi 3, yang jauh lebih mudah dibaca dan tidak terlalu ambigu dibandingkan versi 2.

Terkait:Bagaimana cara menyalin tata letak partisi dari seluruh disk menggunakan alat standar?

Untuk contoh tentang cara mendeteksi kekhususan sistem, lihat autoconf dan di configure skrip berbagai perangkat lunak.


Linux
  1. Mencegah skrip bash berjalan secara bersamaan

  2. Bagaimana Mendeteksi Jika Shell Dikendalikan Dari Ssh?

  3. Cara "Tepat" Untuk Menguji Jika Suatu Layanan Berjalan Dalam Skrip?

  1. Deteksi Jika Tombol Ditekan Dari Script?

  2. Variabel dalam Bash Script yang mempertahankan nilainya sejak terakhir kali dijalankan

  3. Apa cara terbaik untuk memeriksa apakah volume dipasang di skrip Bash?

  1. Bash Script Untuk Menghapus File Terlama Dari Folder A?

  2. Sistem File Mana Yang Harus Dicadangkan Yang Terbaik??

  3. Bash + Bagaimana Cara Keluar Dari Skrip Sekunder Dan Dari Skrip Utama Pada Kedua Kalinya?