#!
(稱為 shebang 或 hashbang)是腳本文件開頭的前兩個字符,用于告訴操作系統應該使用哪個解釋器來執行該腳本。
核心作用:
- 指定解釋器: 明確告訴系統運行這個腳本時應該調用哪個程序(解釋器)來解析腳本內容。
- 使腳本可像程序一樣直接執行: 當你在終端中輸入腳本文件名(如
./myscript.sh
)并按下回車時,操作系統會讀取 shebang 行,找到指定的解釋器,然后將腳本文件作為參數傳遞給該解釋器執行。你不再需要手動輸入python myscript.py
或bash myscript.sh
。
基本語法:
#!interpreter_path [optional_argument]
#!
:固定的開頭符號。interpreter_path
:解釋器的絕對路徑。這是最關鍵的部分。[optional_argument]
:可選的傳遞給解釋器的單個參數(較少用)。
使用方法:
- 必須是文件的第一行: Shebang 必須位于腳本文件的第一行,并且是文件的最開頭兩個字符。
- 使用絕對路徑: 解釋器的路徑必須是絕對路徑(從根目錄
/
開始的完整路徑)。系統不會像在終端中那樣自動搜索PATH
環境變量來查找解釋器。 - 賦予腳本執行權限: 在添加 shebang 后,你需要使用
chmod
命令給腳本文件添加可執行權限,才能像程序一樣直接運行它:chmod +x your_script_name
常見寫法示例:
-
Bash Shell 腳本:
#!/bin/bash echo "Hello from Bash!"
保存為
hello.sh
,然后chmod +x hello.sh
,最后運行./hello.sh
。 -
Python 腳本:
#!/usr/bin/python3 print("Hello from Python 3!")
保存為
hello.py
,然后chmod +x hello.py
,最后運行./hello.py
。 -
使用
/usr/bin/env
查找解釋器(推薦寫法):#!/usr/bin/env bash # 或者用于 Python #!/usr/bin/env python3
- 優點: 更靈活、更具可移植性。
/usr/bin/env
命令會在當前用戶的PATH
環境變量中查找指定的解釋器(如bash
,python3
,node
,perl
等)。這樣你就不需要硬編碼解釋器的絕對路徑(不同系統或用戶安裝路徑可能不同),只要該解釋器在PATH
中就能找到。 - 推薦: 這是現代腳本編寫中更推薦的方式,尤其是當你希望腳本能在不同環境(不同用戶、不同系統)中運行時。
- 優點: 更靈活、更具可移植性。
-
帶參數的解釋器(較少用):
#!/bin/bash -e # 告訴 bash 如果任何命令失敗(返回非零狀態)就立即退出腳本 #!/usr/bin/perl -w # 打開 perl 的警告
總結使用步驟:
- 創建你的腳本文件(如
myscript.sh
)。 - 在文件的第一行寫入 shebang,指定正確的解釋器路徑(推薦用
#!/usr/bin/env interpreter_name
)。 - 保存文件。
- 在終端中,切換到腳本所在目錄,運行
chmod +x myscript.sh
賦予執行權限。 - 通過輸入腳本的路徑來執行它:
- 如果腳本在當前目錄:
./myscript.sh
- 如果腳本在
PATH
包含的目錄中:myscript.sh
(需要先chmod +x
和確保目錄在PATH
中)
- 如果腳本在當前目錄:
重要注意事項:
- 僅對腳本文件有效: Shebang 只對可執行的腳本文件有意義。對于需要顯式傳遞給解釋器的文件(如
bash script.sh
或python script.py
),shebang 行會被當作普通注釋處理。 - 文件編碼: 腳本文件通常應該保存為純文本格式,并且沒有字節順序標記(BOM),尤其是在 Unix/Linux 系統上。建議使用 UTF-8 無 BOM 編碼。
- Windows: Shebang 在原生 Windows 命令提示符(cmd.exe)或 PowerShell 中不被識別。在這些環境中,文件擴展名(如
.py
,.pl
,.rb
)通常關聯到對應的解釋器。但在 Windows Subsystem for Linux (WSL) 或 Git Bash/Cygwin 等類 Unix 環境中,shebang 是有效的。 - 錯誤路徑: 如果 shebang 中指定的解釋器路徑不存在或不可執行,當你嘗試直接運行腳本時會收到類似
"bad interpreter: No such file or directory"
的錯誤。
總而言之,shebang 是讓腳本文件能夠自包含其解釋器需求并像獨立程序一樣直接執行的關鍵機制。 使用 #!/usr/bin/env interpreter
是最通用和推薦的做法。