DEV Community

codemee
codemee

Posted on

macOS 上 #! 的寫法

今天才注意到 macOS 上的 hashbang(也稱 shebang) 寫法有點奇特,會長得像是這樣:

#! /usr/bin/env python3
...
Enter fullscreen mode Exit fullscreen mode

才發現自己跟 shell script 一點都不熟,首先 hashbang 要寫用來執行腳本的執行檔完整路徑,由於是完整路徑,如果遇到環境不同,執行檔路徑不一樣的系統,同一個腳本就可能會找不到執行檔而無法執行。為了解決這個問題, 就有一個特別的執行檔,也就是剛剛看到的 /usr/bin/env,單獨執行它會顯示所有的環境變數,像是這樣:

$ env
USER=meebox
LOGNAME=meebox
HOME=/Users/meebox
PATH=/Users/meebox/.nvm/versions/node/v24.4.0/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/homebrew/bin
SHELL=/bin/zsh
...
LANG=zh_TW.UTF-8
LC_ALL=zh_TW.UTF-8
_=/usr/bin/env
Enter fullscreen mode Exit fullscreen mode

如果加上額外的引數,它就會依據 PATH 環境變數去找該引數指定的執行檔,所以剛剛看到的那一行:

#! /usr/bin/env python3
Enter fullscreen mode Exit fullscreen mode

就可以在不需要寫出 python3 絕對路徑的前提下,自動找到並以 python3 來執行腳本了。而且這個 /usr/bin/env 也不是 macOS 才有,現代的 Linux 發行版本預設也幾乎都會安裝這個屬於 coreutils 套件的 env 工具程式。

Top comments (0)