Unix like - Shebang Line

#!/usr/bin/python
# 後續代碼

第一行, 稱之為 shebang line, 至於他在幹嘛? 進來看看唄

直接看範例

假設有個檔案放在 /home/tony/say_hello.py

#!/usr/bin/python
print 'Hello'

裡頭的第一行, 宣告了 /home/tony/say_hello.py 這個檔案的 預設執行程式

你懂 python 以及 linux 的話, 你一定看得懂下面這句

$ ls -l
-rw-r--r--   1 tony  staff    32  3  9 23:35 say_hello.py

# 使用 python 執行 say_hello.py
$ python say_hello.py
Hello

除了上述的方式執行以外, 你還可以透過下列方式來執行此腳本

$ chmod u+x say_hello.py
$ ls -l
-rwxr--r--   1 tony  staff    32  3  9 23:35 say_hello.py
#  ↑ 讓此腳本, 可被擁有者執行

# 使用檔案內的 shebang line(如果有定義的話), 執行此腳本
$ ./say_hello.py
Hello

再來看另一個範例

假設我們在 /$HOME/demo_shebang/ 裡頭建立了 python3 虛擬環境…

$ cd ~
$ mkdir demo_shebang
$ cd demo_shebang
$ python3 -m venv venv
$ source venv/bin/activate

(venv)$ which python
/Users/tony/demo_shebang/venv/bin/python

(venv)$ vim say_hi.py
# ----- 內容如下 -----
#!/Users/tony/demo_shebang/venv/bin/python
print('This is python3 in virtual environment')
# ----- 內容如上 -----

# 執行方式1 - 需要進入此虛擬環境
(venv)$ python say_hi.py
This is python3 in virtual environment

# 執行方式2 - 使用絕對路徑方式
$ /Users/tony/demo_shebang/venv/bin/python say_hi.py
This is python3 in virtual environment

# 執行方式3 - 使用 shebang line 定義的方式來執行
$ chmod u+x say_hi.py
$ ./say_hi.py
This is python3 in virtual environment

看到這或許你有一點點感覺了

再來個 shell script 的範例

$ cd ~
$ vim demo_shell.sh
# ----- 內容如下 -----
#!/bin/bash
echo "$(whoami)" "$(whoami)" No 1
# ----- 內容如上 -----

# 執行方式1
$ bash demo_shell.sh
tony tony No 1

# 執行方式2 - 使用 預設執行程式(shebang line)
$ chmod u+x demo_shell.sh
$ ./demo_shell.sh
tony tony No 1

以上舉了三個範例, 應該懂了吧!!

如果哪天看到同事網路上超人家腳本, 明明你們用的是純 python3, 但他卻這樣超…

#!/usr/bin/python
# 其他程式...(略)...

請從他後腦勺給他巴下去

寫第一行根本是沒有必要的, 而且嚴謹來說是錯誤的寫法

所以 shebang line 好處是?

自己想想囉, 你們公司可能會寫一堆 python3, shell script, 甚至其他直譯語言的腳本

你只要定義好每個腳本自己的 shebang line

日後只要直接輸入那份腳本的路徑就可以直接執行了

後記

shebang line 要放在第一行, 如果不寫的話, 也不會有錯

不要再亂超人家 Code 而不知道在超殺毀了



See also