Awk

分發腳本:我應該使用 /bin/gawk 還是 /usr/bin/gawk 進行 shebang?

  • May 25, 2020

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,rmls(嗯,還沒有)。

關於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,這並不重要。
  • {}— 如果上述條件成立,則什麼也不做。

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