在 Linux 指令碼中使用 Shebang #!


介紹

在 Linux 系統中,Shebang(#!)是指令碼開頭的一行特殊指令,它告訴作業系統在執行指令碼時使用哪個直譯器。這一行也被稱為 **雜湊邦 (hashbang)**、**沙邦 (shabang)** 或“**井號感嘆號**”,它是指令碼的第一行,以“#!”開頭,後跟直譯器的路徑。Shebang 行很重要,因為它允許你在 Linux 系統上執行用任何語言編寫的指令碼,而不僅僅是 shell 指令碼。

理解 Shebang

什麼是 Shebang?

**Shebang “#!”** 這個符號指示在執行指令碼時使用哪個直譯器或哪個版本的直譯器。它也稱為“井號感嘆號”、“沙邦”、“雜湊邦”或“磅邦”。這個名稱據信起源於“**SHarp bang**”或“**haSH bang**”的部分縮寫。

Shebang 始終是指令碼的第一行。由於它以“#”符號開頭,包含 Shebang 的行不會被 shell 處理。當 Linux 系統執行文字檔案時,它將 Shebang 視為 shell 指令。它找到正確的直譯器並執行它,並將檔名作為輸入傳遞給直譯器。例如,執行名為“**~/scripts/shebang**”的檔案,該檔案以 Shebang “**#!/bin/sh**”開頭,在功能上等效於執行“** /bin/sh ~/scripts/shebang**”命令。要進行正確的處理,文字檔案必須是可執行的。

Shebang 的重要性

**Shebang** 指令具有以下優點:

  • 允許使用者將指令碼和檔案作為命令執行。

  • 隱藏某些實現細節,例如 **直譯器** 的名稱。

  • 不需要使用者知道直譯器的絕對路徑或如何使用 **env** 命令。

  • 允許使用特定版本的直譯器,例如 **python2** 與 **python3**。

  • 允許更改直譯器,同時保持相同使用者的行為和命令。

  • 可以自動將強制選項傳遞給直譯器。

如果直譯器路徑是硬編碼的,則可能會出現潛在的缺點。如果直譯器的位置發生更改,則必須同時更新 Shebang 指令。否則,指令碼可能會停止工作。

在指令碼中使用 Shebang

Shebang 格式

**Shebang** 指令遵循以下格式:

#!interpreter [options]

這是一個 Shebang 指令的實際示例。此 Shebang 需要使用 Bourne sh shell 來執行指令碼。此示例使用絕對路徑來定義直譯器。

#!/bin/sh

env 實用程式可以幫助查詢直譯器的路徑。在這種情況下,**Shebang** 告訴系統使用“**/usr/bin/env**”來找出 **python2** 直譯器的路徑。此技術更健壯,因為即使路徑更改,它也能繼續工作。

#!/usr/bin/env python2

使指令碼可執行

將 **shebang** 行新增到指令碼後,需要使指令碼可執行。為此,可以使用帶有“+x”選項的 chmod 命令。例如:

$ chmod +x script.py

此命令使“script.py”檔案可執行。

執行指令碼

使指令碼 **可執行** 後,只需在命令列鍵入其名稱並按 Enter 鍵即可執行它。例如:

$ ./script.py

此命令執行“script.py”檔案。

Shebang 最佳實踐

遵循的規則

為了有效地實現 Shebang,請記住以下規則。

  • 指令必須始終以“#!”字元組合開頭

  • 為了使此方法正常工作,**Shebang** 必須出現在檔案的首行。如果它出現在其他位置,則會被視為註釋。

  • 指定直譯器的完整絕對路徑或使用 env 來查詢正確的路徑。在 **直譯器** 名稱後插入直譯器選項。編譯器選項的實現細節因不同的系統而異。但是,所有主要作業系統至少支援一個選項。

  • “#!”字元組合和直譯器名稱之間允許一個或多個空格,但不是必需的。例如,#!interpreter 和#!interpreters 指令都是有效的,並且在功能上是等效的。

  • Linux 允許第二個指令碼充當第一個指令碼的直譯器,但並非所有作業系統都是如此。

Shebang 特殊指令

“**#!/bin/false**”指令是一個特殊的 Shebang。它立即退出並返回錯誤狀態。防止某些系統檔案在其適當的上下文之外執行。

結論

**Shebang** 行是一個重要的工具,允許你在 Linux 系統上執行用任何語言編寫的指令碼。它告訴作業系統在執行指令碼時使用哪個 **直譯器**,並且是指令碼的第一行。Shebang 行有幾個優點,例如允許使用者將指令碼和檔案作為命令處理,隱藏實現細節,並允許使用特定版本的直譯器。將 shebang 行新增到指令碼並使其可執行後,只需在命令列鍵入其名稱即可執行它。藉助 Shebang 行,你可以輕鬆地使用適當的直譯器在 Linux 系統上執行任何語言編寫的指令碼。需要注意的是,如果 shell 路徑是 **硬編碼的**,並且 shell 位置發生變化,則必須在 shell 中更新 **shebang** 指令。

更新於:2023年2月13日

6000+ 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告