Bash

單或雙支架和便攜性

  • August 15, 2016

關於“if”語句之間的區​​別,我在這裡找到了一些非常好的答案[。對於特定的命名 shell,使用over[[似乎是一個好主意(而且它也更快)。[[``[

但是,我仍然不清楚可移植性。如果我的目標是為 POSIX 兼容的 shell 編寫腳本,我會以 開頭的腳本,那麼#!/bin/sh這種語法的允許程度如何。根據我的閱讀,雙括號不在 POSIX 標準中,但在“現實世界”中,這真的有多大問題?

我想我的意思是我想要一個可移植的腳本,但它足以在所有可行的 POSIX shell 上工作,比如 2000-2005。意思是,它不是標準的一部分,真的,但實際上從 2005 年開始的任何 shell 幾乎肯定會接受該語法。

此外,還有一個關於腳本可移植性和 POSIX 的更普遍的問題:其他作者如何處理這個問題?我了解案例和目標受眾決定了大部分決定,但是您是否嘗試盡可能接近 POSIX 以減少整個 Internet 可能存在的不兼容性,或者您是否利用大多數 shell 的所有好東西尚未使其接近 POSIX 標準的支持?

我首先嘗試使我的大部分腳本盡可能符合 Bourne 和 POSIX。不過,隨著時間的推移,通過閱讀更多的 Bash 文件和在網上看到其他人的腳本,我不得不說,利用這些其他功能可以使腳本更易於閱讀,並且在許多情況下更小。

如果我的目標是為 POSIX 兼容的 shell 編寫腳本,我會以 #!/bin/sh 開頭的腳本,那麼這種[[語法是多麼允許。

一點也不。許多現代的基於 Linux 的系統預設使用dashas /bin/sh,它完全符合 POSIX 標準,不再適用,因此[[無法正常工作。這包括最近的每個DebianUbuntu版本,以及它們的衍生版本,以及許多其他發行版。從歷史上看,這些系統通常在那裡使用 Bash,並故意切換以提高性能。

許多其他系統,包括大多數 BSD 和大多數商業 Unices,都不支持[[並且永遠不會支持:它們sh是 POSIX-only,或者它的擴展不包含[[語法。OpenBSDsh確實支持 的版本,[[這與 Bash 的稍有不同;我不知道還有其他人這樣做,儘管它們可能存在。否則,只有將 Bash 用作/bin/sh(或較少使用zsh,甚至較少使用其他一些)的系統[[才能在聲明為sh腳本的東西中工作。


另一方面,大多數係統在實踐中都安裝了 Bash,只要讓你的腳本顯式執行bash就足夠了。無論如何, Bash 的sh-emulation 模式總是被打破。

由於您依賴 Bash 功能,因此我看不出有任何理由將其聲明為sh腳本:只需說出#!/bin/bash並完成,[[盡可能多地使用 - 甚至更好,完全排除的[。如果您想要最大的可移植性,請使用[ortest和 POSIX sh1,並仔細編寫。

1請注意,一些商業 Unices 已經或已經擁有非 POSIXsh作為/bin/sh; 統一處理那些您需要使用系統 POSIX 的完整路徑執行腳本的腳本sh

引用自:https://unix.stackexchange.com/questions/156769