如果我正在編寫 bash 腳本,我為什麼要關心 POSIX?
尋找我可以對這個問題進行的建議/編輯以重新打開它。很多這些答案對我來說似乎是客觀的,它們是我正在尋找的答案類型。
我已經閱讀了四篇關於 POSIX 的文章,但無法找到答案。現在我知道 POSIX是什麼,我已經知道標準是什麼,但我仍然不確定為什麼 POSIX 標准在今天仍然適用。我讀過的三篇文章中的一篇是對 Richard Stallman 的採訪。在其中,他說
賽斯:符合 POSIX 的自由軟體項目更容易移植到其他類 Unix 系統嗎?
RMS:我想是這樣,但我在 1980 年代決定不把時間花在將軟體移植到 GNU 以外的系統上。…
賽斯:POSIX 對軟體自由重要嗎?
RMS:在基本層面上,它沒有區別。然而,標準化……幫助我們更快地朝著……自由軟體前進。這是在 1990 年代初實現的……
$$ emphasis mine $$
他的回答帶有 GNU 的觀點,但他似乎在回答我的問題,“POSIX 不再相關”?
這裡有一些更具體的東西來解釋為什麼我首先對此感興趣:在這個答案中,我建議使用 process redirection
<(command)
。回复說,“不幸的是,程序重定向是一個非 POSIX 功能,因此它不會在所有機器上都得到支持。”我想我假設腳本以
#!/bin/bash
. 由於程序重定向是 bash 的一項功能,這是否意味著任何帶有 bash 的系統都可以移植?根據 Wikipedia的說法,bash“已被用作大多數 Linux 發行版的預設登錄 shell”。鑑於,這篇文章說,“目前,由於成本高昂,Linux 尚未獲得 POSIX 認證,除了浪潮 K-UX 的兩個商業 Linux 發行版
$$ 12 $$和華為 EulerOS$$ 6 $$. 相反,Linux 被視為主要符合 POSIX 標準。” 所以,我認為POSIX 的目標是可移植性,但是,至少根據我的經驗,如果我的腳本在 bash 中工作並忽略 POSIX,那麼我的腳本會比其他方式更便攜。
重申我的問題,為什麼任何編劇都應該花時間關注 POSIX 合規性?
如果您知道您將只使用一些特定的外殼,而不僅限於 POSIX 功能,也許您不需要關心。
但是,您仍然有可能最終不得不使用其他東西,在這種情況下,了解非標準功能可能會有所幫助。也許你一生都在 Linux 上工作,但是一個新的 $DAYJOB 讓你陷入了一些完全不同的系統的外殼。
並不是說它只是非Linux系統。嵌入式/小型系統可能只有 Busybox,其
ash
基於預設的 shell 比 Bash 更接近普通的 POSIX sh。(Busybox 還有另一個 shell,hush
我不太熟悉。我也懷疑它是 Bash 複製。無論如何,在小型系統上,通常需要較小的 shell,這很可能意味著更少的功能。)另外,眾所周知,Debian(以及因此,Ubuntu)也很關心:由於 Bash 相當慢,並且在 systemd 出現之前,shell 腳本被大量用於系統啟動,因此他們將預設設置更改/bin/sh
為 Dash,另一個基於 ash 的 shell。(參見例如LWN 文章和Ubuntu wiki 上的DashAsBinSh。)還有一些情況下,做 POSIX 的事情不需要任何成本,因為這些功能是等價的。我承認,我能想到的很簡單,例如使用
[ a = b ]
代替[ a == b ]
,或i=$((i + 1))
代替((i++))
。無論如何,存在這樣的情況,尤其是。using==
似乎相當普遍,沒有任何好處。(雖然[[ .. ]]
vs.[ .. ]
有點不同,但它們有實際差異。)這並不是說,例如局部變數、數組、程序替換,以及字元串替換和切片擴展等永遠不應該被使用!恰恰相反,我認為它們在需要時非常有用。只是有助於意識到它們並不適用於世界上的每個外殼。或者更糟糕的是,它們的工作方式不同。
綜上所述,如果我們考慮 unix.SE 上的答案,應該注意站點標題是“Unix & Linux”,它被稱為
*unix*.stackexchange.com
,而不是*linux*.stackexchange.com
,因此記住非 Linux 系統是有些相關的。另外,我猜很多長期使用者都是這樣的書呆子。;)如果您樂於離開 POSIX 鏈並依賴 Bash,您可能還想考慮使用 zsh。它甚至更不兼容 POSIX,這實際上使它在許多方面更加理智。