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.