更新/答覆

更新/答覆

好吧,所以我有點難住了。

我正在深入研究 BASH,目的是為我的雇主編寫一些自動化腳本。另外,在這裡全面披露:我是網路人員;到目前為止,我已經掌握了足夠的 CLI 來操作 git。

我的問題是,大約一半員工使用 MacOS,另一半使用 GitBash,似乎支持不同的標誌(或者,更相關的是,不是支援)在兩個不同的 BASH 實例上。進一步的難題:隨著每個人都在家工作以及世界末日等等,我無法可靠地要求我們的每一位員工「切換到發行版 X」/「升級到版本 Y」。

現在,我知道如何測試是否安裝了給定的程式(不過,我承認:我不太清楚為什麼一個程式比另一個程式更好,請糾正我,如果其中一個程式是處理這個問題的糟糕方法),形式如下:

type foo >/dev/null 2>&1 || { echo >&2 "COMMAND NOT FOUND"; }

...和...

[ -x "$(command -v foo)" ] || echo 'COMMAND NOT FOUND'

……但在我的具體情況下,兩個平台都已foo安裝,但是,例如,只有 MacOS 有-b/--bar修飾符標誌。那麼,如何測試命令的給定功能是否受支援?每次我嘗試將標誌傳遞給其中一個測試時,執行測試的程式似乎認為它是針對 IT 的,完全忽略它,或出錯。

如何測試foo -b/是否foo --bar為有效/已安裝/可存取的命令?

更新/答覆

由於下面收到的合理且誠實的優秀答案中提出的普遍共識似乎是“不,一個人不能”的混合體,並被“有太多的因素能夠可靠地收集任何類似於結論性的、有用的數據」所打斷。 ,我要結束這個問題了。

我在這裡的目的是確定採用的正確方法是驗證兩個不同平台之間是否存在可能不存在的標誌 -已知的幸運的是,就我而言,平台 - 在這種情況下,適當的策略似乎是我目前正在採取的策略:維護兩個單獨的腳本,每個平台一個

感謝所有花時間回覆的人!非常感謝。

答案1

以一種有用且可靠的方式,你可能做不到。您基本上需要單獨測試每個命令以查看它的作用。 (命令“echo”是一個特別糟糕的例子。有很多變體。)

您可以做的是檢查版本號和作業系統。

對於 BASH,請嘗試

bash --version | head -1

或者

bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"

或只使用預先定義的符號$BASH_VERSION

對於作業系統來說,uname -s這是一個好的開始,其他選項可能會為您提供更多詳細資訊。

一旦掌握了這些,您就可以開始根據需要編寫條件代碼。

話雖如此……對於foo可能採用或不採用--bar 選項的命令的具體情況:弄清楚這兩個版本如何處理匹配的命令行,否則可以安全地運行。例如,如果兩個版本都foo報告第一個無效選項,請嘗試編寫以下內容:

output="$( foo --bar --somethingtotallyinvalid 2>&1 )"

然後找出變數輸出中的內容。當然,在這種情況下,它可能是有效的選項清單。如果是這樣,您可以考慮:

output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"

相關內容