分發腳本:我應該使用 /bin/gawk 還是 /usr/bin/gawk 進行 shebang?
gawk 通常在 /bin 或 /usr/bin 中嗎?我會去,
#!/usr/bin/env gawk
但我不能使用參數。現在我正在使用#!/bin/gawk -f
. 該腳本很長,包含很多單引號,並且可以與標準輸入一起使用。GNU Awk 手冊有1.1.4 Executable awk Programs 部分,它在其範例中使用 #!/bin/awk 但接著說:
請注意,在許多系統上
awk
可能會找到 in/usr/bin
而不是 in/bin
。買者自負。大多數人做什麼?我讀過sed 應該在 /bin 中標準化,而 perl 應該在 /usr/bin 中標準化(與 sed 連結相同的頁面,但他們不會讓我為這篇文章創建第三個連結)。awk/gawk 呢?有誰知道哪個更常見或更流行?
Shebang 本來就不應該那麼靈活。在某些情況下,第二個參數可以工作,我認為 FreeBSD 就是其中之一。
gawk 和作業系統附帶的大多數實用程序預計將在
/usr/bin/
.在早期的 UNIX 時代,通常
/usr/
安裝在 NFS 或一些較便宜的介質上以節省本地磁碟空間和每個工作站的成本。/bin/
應該具備在單使用者模式下啟動所需的一切。由於/usr/
沒有安裝在可靠的媒體上,/bin/
因此包含足夠的實用程序以使其對一般管理和故障排除足夠友好。這最初是在 Linux 中繼承的,但由於磁碟空間不再是問題並且在大多數情況下
/usr/
位於根文件系統中,目前的趨勢是將所有內容移入/usr/bin
(至少在 Linux 世界中)。因此,發行版安裝的大多數實用程序都應該在那裡找到。即使是最基本的實用程序,如cp
,rm
等ls
(嗯,還沒有)。關於shebang的選擇。傳統上,這是管理員或使用者必鬚根據他們的環境進行編輯的內容。開發人員都知道,在其他人的系統中,解釋器可能位於文件系統中的任何位置(例如
/usr/local/bin
,/opt/gawk-4.0.1/bin
)。正確打包的腳本(rpm、deb 等)依賴於發行版包(即解釋器具有已知位置)或在安裝期間設置正確 hashbang 的配置腳本。
如果您不需要將參數傳遞給命令,那麼
#!/usr/bin/env gawk
就是要走的路,但是許多核心(包括 Linux)只接受 shebang 程序的單個參數。否則,您可以製作一個既是 shell 包裝器又是 awk 腳本的多語言程序。這是 awk 的一個。
#!/bin/sh true + /; exec gawk -f "$0"; exit; / {} # awk script starts here
外殼解析:
true + /;
—true
帶有兩個惰性參數+
和/
.- 呼叫
gawk
. 這可以是任何不包含換行符和斜杠的 shell 片段\/
(shell 不介意,除了引號內)。該呼叫用於
exec
用 gawk 替換 shell,而不是將 gawk 作為子程序執行。
exit;
— 退出 shell,以防 gawk 未找到。之後的任何內容都將被忽略,除非它應該是有效的 shell 語法,以防 shell 在開始執行之前嘗試解析整行。awk解析:
- 斜線之間的位是正則表達式。
true + /REGEX/
- 一個條件。true
是一個未定義的變數,所以它的數值是 0,這並不重要。{}
— 如果上述條件成立,則什麼也不做。