將 Python 腳本變成一個「命令」{#sec-e5db7dc8c348}
#!/usr/bin/env python3
大家在 Linux 上編寫 Python 腳本時,都知道可以在第一行加上像 #!/usr/bin/env python3 這樣的 shebang 嗎?
然而,許多人似乎不喜歡特別加上 shebang。他們可能認為:「這不過是省去輸入 python3 這個命令的麻煩罷了,那點功夫自己打字就行了。」
如果只是說「少打一點字的便利功能」,坦白說,這沒什麼吸引力。 但如果換個說法,情況就完全不同了。
「將我的 Python 程式碼偽裝成 Linux 原生命令的技巧」
這聽起來是不是有點誘人呢?

Python 腳本升級為「工具」的瞬間{#sec-6078e36b7072}
這一行程式碼:
#!/usr/bin/env python3
如果你只是將它理解為「告知 Python 路徑」,那麼你之前只是執行了一段程式碼;
但從正確使用它的那一刻起,你將會
👉 在系統中添加了一個工具。
兩者之間的差異比你想像的要大。
1. 擺脫 .py 的束縛{#sec-789004867c8d}
我們習慣性地這樣寫:
python3 crawler.py
這感覺就像是:
「這是一個 Python 檔案… 請用 Python 執行它…」
這聽起來非常被動。
然而,一旦加上 shebang 並透過 chmod +x 賦予執行權限,從那時起就不再需要擴展名了。
./crawler
感覺語氣完全不同了。
專注於功能而非語言{#sec-7518d1265207}
crawler
backup
log-cleaner
notify
現在,這些檔案:
-
是 Python 寫的,
-
還是 C 寫的,
-
或是 Go 寫的,
都變得不再重要。
換句話說,我們不再關注工具是用什麼語言實現的,而是專注於腳本本身的功能。這種心理上的差異,親身體驗後會感覺相當顯著。
我的程式碼不再是:
-
script.py,而是 -
一個 Linux 命令
感覺我的程式碼可以與 ls、grep、awk 並駕齊驅。
這就是第一種快感。
2. 自然地融入管線中{#sec-1ae280c7d5d4}
我個人認為,Linux 的真正力量在於它的管道符 |。在 Linux 眾多優點中,管道符的存在可謂是頂級的。
將命令串聯起來 👉 形成一個連續的流程
如果用沒有 shebang 的腳本來構成這個美麗的管道,就會像這樣:
cat access.log | python3 parser.py | python3 filter.py
總覺得… 流程被中斷了。
- 「啊,這是 Python。」
- 「啊,又是解釋器。」
總是被這些打斷。
然而,裝載了 shebang 的腳本將會是這種模樣:
cat access.log | parser | filter | notifier
或是
ps aux | my-filter | sort | uniq
感覺是不是不一樣了?
流程不再中斷
-
接收輸入
-
進行處理
-
然後傳遞
感覺這一切都自然而然地銜接起來。
若稍加誇飾地說,它不再是「Python 腳本」,而是一個遵循 Unix 哲學的濾波器。感覺我的程式碼,其定位已從 Python 的世界轉移到了 Linux 的世界。
3. 用 Python 輕鬆打造專屬的 Linux 命令{#sec-7acaed130940}
當然,在 Linux 中進行簡單的自動化,Bash 腳本會是首先想到的。它無需額外安裝套件(import),就能像指揮自己的身體一樣,靈活運用系統命令。
但老實說,捫心自問,當條件語句變得複雜,開始處理資料結構時,Bash 程式碼往往會不知不覺地變成「日後不願閱讀的密碼」。在編寫當時,你可能沉浸其中,覺得易於理解,但幾個月後為了維護而打開它時,是否曾感到沮喪呢?
這正是 Python 真正價值所在。
-
可讀性的勝利: 幾個月後,當你為了維護而打開檔案時,那份安心感。Python 會清晰地解釋你過去的想法。
-
強大的套件生態系: 即使是複雜的 API 呼叫或資料處理,利用 Python 的進階套件,也能在短短幾行程式碼內完成。當你還在與 Bash 搏鬥時,Python 已經完成了實作,甚至可以悠閒地喝杯咖啡了。
最終,這策略就是「用 Python 的生產力來編寫邏輯,並以 Linux 原生命令的簡潔性來執行」。
刪除 .py 擴展名,賦予 chmod +x 權限,然後將該檔案悄悄地放入 PATH 路徑的某個位置。接著,在終端機中輸入一個單詞,例如 deploy,然後看著程式碼運行起來。
一種奇妙的快感將會湧上心頭。你會感覺自己不只是編寫了一段程式碼,而是為自己的系統創造了一個永久存在的「專屬新命令」。
總結{#sec-6fad019925de}
Shebang 並不是一個微不足道的語法。
#!/usr/bin/env python3
我想說,這不僅僅是執行路徑,它更是一個將普通腳本轉變為命令的角色宣告。
讀者們,現在就試著在你的 Python 程式碼中加入 shebang,並在終端機中直接輸入你的程式碼名稱吧。 那時指尖感受到的,就是這項技術的本質。
延伸閱讀
目前沒有評論。