Linux上的Shebang符號

2021-06-26 14:16:20 字數 1923 閱讀 2486

使用linux或者unix系統的同學可能都對#!這個符號並不陌生,但是你真的了解它嗎?本文了將給你簡單介紹一下shebang(」#!」)這個符號。

首先,這個符號(#!)的名稱,英譯過來叫做」shebang」或者」sha-bang」(還有其他一些名稱,不過我一般就用這兩個)。

詞源與歷史:

shebang的名字來自於sharp和bang,或hash bang的縮寫,指代shebang中#!兩個符號的典型unix名稱。 unix術語中,井號通常稱為sharp,hash或mesh;而嘆號則常常稱為bang。也有看法認為,shebang名字中的sh來自於預設shell bourne shell的名稱,sh,因為常常使用shebang呼叫之。

在2023年版的advanced bash scripting guide(revision 6.2)中,shebang被稱為"sha-bang",同時提到"也寫作she-bang或sh-bang",但該檔案中沒有提到"shebang"這一形式。

丹尼斯·里奇在被問及他會如何稱呼這一特性時,他答道:

發信人:"ritchie, dennis m (dennis)** ctr **" 

收信人:< [redacted]@talisman.org>

日期:thu, 19 nov 2009 18:37:37 -0600

主題:re: what do -you- call your #! line?

我不記得我們曾經給它取過乙個適當的名字。匯入這一特性已經是相當晚了--我覺得我是從關於伯克利unix的ucb會議上的某人那裡得到的這一靈感;我可能是首先實現它的人之一,但這個創意是來自於別人的。

至於它的名字:可能是類似於"hash-bang"的英國風描述性文字,但我沒有在任何場合使用類似寵物的名字來描述它。

此致,dennis

用途:

shebang這個符號通常在unix系統的指令碼中第一行開頭中寫到,它指明了執行這個指令碼檔案的解釋程式。

1. 如果指令碼檔案中沒有#!這一行,那麼它執行時會預設用當前shell去解釋這個指令碼(即:$shell環境變數)。

2. 如果#!之後的解釋程式是乙個可執行檔案,那麼執行這個指令碼時,它就會把檔名及其引數一起作為引數傳給那個解釋程式去執行。

3. 如果#!指定的解釋程式沒有可執行許可權,則會報錯「bad interpreter: permission denied」。如果#!指定的解釋程式不是乙個可執行檔案,那麼指定的解釋程式會被忽略,轉而交給當前的shell去執行這個指令碼。

4. 如果#!指定的解釋程式不存在,那麼會報錯「bad interpreter: no such file or directory」。注意:#!之後的解釋程式,需要寫其絕對路徑(如:#!/bin/bash),它是不會自動到$path中尋找直譯器的。

5. 當然,如果你使用」bash test.sh」這樣的命令來執行指令碼,那麼#!這一行將會被忽略掉,直譯器當然是用命令列中顯式指定的bash。

舉例說明:

以test.sh指令碼為例,其中的**如下

1

2

3

#!/bin/bash

echo"hello, world."

echo"hello, $."

給指令碼賦予執行許可權:

chmod a+x test.sh

可直接使用以下方式執行指令碼,執行之時,其實是 /bin/bash ./test.sh jay

./test.sh jay

返回結果為:

hello, world.

hello, jay.

【文章素材:

**:茶話匯 » linux上的shebang符號(#!)

LINUX上的SHEBANG符號

這個符號 的名稱,叫做 shebang 或者 sha bang 還有其他一些名稱,不過我一般就用這兩個 shebang這個符號通常在unix系統的指令碼中第一行開頭中寫到,它指明了執行這個指令碼檔案的解釋程式。如果 之後的解釋程式是乙個可執行檔案,那麼執行這個指令碼時,它就會把檔名及其引數一起作為引...

LINUX上的SHEBANG符號

這個符號 的名稱,叫做 shebang 或者 sha bang 還有其他一些名稱,不過我一般就用這兩個 shebang這個符號通常在unix系統的指令碼中第一行開頭中寫到,它指明了執行這個指令碼檔案的解釋程式。如果 之後的解釋程式是乙個可執行檔案,那麼執行這個指令碼時,它就會把檔名及其引數一起作為引...

shell指令碼編寫中的 shebang詳解

shebang 這個符號通常在 unix 系統的指令碼中第一行開頭中寫到,它指明了執行這個指令碼檔案的解釋程式。1.如果指令碼檔案中沒有 這一行,那麼他執行時會預設使用當前 shell 去解釋這個指令碼 即 shell 環境變數 2.如果 之後的解釋程式是乙個可執行檔案,那麼執行這個指令碼是,他就會...