(從腳本)檢測是否安裝了軟體的最佳方法是什麼?
我以前對
which
不同平台(Linux 與 Solaris vx。OS X)的命令輸出差異感到沮喪,不同的 shell 也可能會影響這個問題。type
已被建議作為更好的選擇,但它的便攜性如何?在過去,我編寫了一些函式來解析
which
和處理我遇到的不同案例的輸出。它們可以在我使用的機器上工作,因此對於我的個人腳本來說還可以,但是對於我要發佈在某個地方供其他人使用的軟體來說,這似乎非常不可靠。僅舉一個可能的例子,假設我必須從腳本中檢測 bash 和 zsh 在機器上是否可用,然後如果 zsh 存在則使用 zsh 執行命令,如果 zsh 不存在並且 bash 足夠則使用 bash版本沒有特定的錯誤。腳本的其餘大部分可能是 Bourne shell 或 Ruby 或其他任何東西,但必須使用 zsh 或最新版本的 bash 來完成這一特定的事情(AFAIK)。
我可以指望
type
跨平台使用嗎?是否有其他替代方法which
可以輕鬆且一致地回答是否安裝了特定軟體的問題?(如果您還想提供與我給出的範例特別相關的想法,那很好,但我主要只是詢問一般情況:找出特定設備是否安裝在給定機器上的最可靠方法是什麼?)
在 21 世紀,特別是如果您的目標是可能有 bash 或 zsh 的機器,您可以指望
type
它可用。(它在 1970 年代或 1980 年代初期的極其古老的 unice 中並不存在。)你不能指望它的輸出意味著什麼,但如果有一個名為該名稱的命令,你可以指望它返回 0 並且否則非零。
which
不是標準的,在實踐中是不可靠的。type
是推薦的替代方案。whereis
遭受與相同的問題which
並且不太常見。whence
特定於 ksh 和 zsh。在可能的情況下,測試命令的存在並測試其行為是否合理會更可靠。例如,通過執行來測試是否存在合適版本的 bash
bash -c 'somecommand'
,例如# Test for the `-v` operator (which appeared in bash 4.2) if bash -c 'test -v HOME' 2>/dev/null; then …
今天,您幾乎可以依賴於Singe UNIX 規範第 2 版中的所有內容(除了 Fortran 和 SCCS 等外來的東西,它們無論如何都是可選的)。您也可以依賴大多數版本 3,但這還沒有在所有地方完全實現。版本 4支持更粗略。如果您要閱讀這些規範,我建議您閱讀版本 3,它比版本 2 更具可讀性和更少歧義。
有關如何檢測系統特性的範例,請查看autoconf和
configure
各種軟體的腳本。另請參閱可移植 shell 程式的參考資料以獲取更多提示。