## 將 Python 腳本變成一個「命令」{#sec-e5db7dc8c348} `#!/usr/bin/env python3` 大家在 Linux 上編寫 Python 腳本時,都知道可以在第一行加上像 `#!/usr/bin/env python3` 這樣的 shebang 嗎? 然而,許多人似乎不喜歡特別加上 shebang。他們可能認為:「這不過是省去輸入 `python3` 這個命令的麻煩罷了,那點功夫自己打字就行了。」 如果只是說「少打一點字的便利功能」,坦白說,這沒什麼吸引力。 但如果換個說法,情況就完全不同了。 > **「將我的 Python 程式碼偽裝成 Linux 原生命令的技巧」** 這聽起來是不是有點誘人呢? ![在 Linux 中,使用 Python 腳本的 pi-pi 處理流程圖](/media/whitedec/blog_img/3d9a3bd717534666b5e3ced5b2867e89.webp) --- ## Python 腳本升級為「工具」的瞬間{#sec-6078e36b7072} 這一行程式碼: ```python #!/usr/bin/env python3 ``` 如果你只是將它理解為「告知 Python 路徑」,那麼你之前只是**執行了一段程式碼**; 但從正確使用它的那一刻起,你將會 👉 **在系統中添加了一個工具**。 兩者之間的差異比你想像的要大。 --- ## 1. 擺脫 `.py` 的束縛{#sec-789004867c8d} 我們習慣性地這樣寫: ```bash python3 crawler.py ``` 這感覺就像是: > 「這是一個 Python 檔案… 請用 Python 執行它…」 這聽起來非常被動。 然而,一旦加上 shebang 並透過 `chmod +x` 賦予執行權限,從那時起就不再需要擴展名了。 ```bash ./crawler ``` 感覺語氣完全不同了。 --- ### 專注於功能而非語言{#sec-7518d1265207} ```bash crawler backup log-cleaner notify ``` 現在,這些檔案: - 是 Python 寫的, - 還是 C 寫的, - 或是 Go 寫的, 都變得不再重要。 換句話說,我們不再關注工具是用什麼語言實現的,而是**專注於腳本本身的功能**。這種心理上的差異,親身體驗後會感覺相當顯著。 我的程式碼不再是: - `script.py`,而是 - **一個 Linux 命令** 感覺我的程式碼可以與 `ls`、`grep`、`awk` **並駕齊驅**。 這就是第一種快感。 --- ## 2. 自然地融入管線中{#sec-1ae280c7d5d4} 我個人認為,Linux 的真正力量在於它的管道符 `|`。在 Linux 眾多優點中,管道符的存在可謂是頂級的。 **將命令串聯起來 👉 形成一個連續的流程** 如果用沒有 shebang 的腳本來構成這個美麗的管道,就會像這樣: ```bash cat access.log | python3 parser.py | python3 filter.py ``` 總覺得… 流程被中斷了。 - 「啊,這是 Python。」 - 「啊,又是解釋器。」 總是被這些打斷。 然而,裝載了 shebang 的腳本將會是這種模樣: ```bash cat access.log | parser | filter | notifier ``` 或是 ```sh 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 並不是一個微不足道的語法。 ```bash #!/usr/bin/env python3 ``` 我想說,這不僅僅是執行路徑,它更是一個將普通腳本**轉變為命令的角色宣告**。 讀者們,現在就試著在你的 Python 程式碼中加入 shebang,並在終端機中直接輸入你的程式碼名稱吧。 那時指尖感受到的,就是這項技術的本質。 **延伸閱讀** - [Linux 腳本第一行的意義是什麼?`#!/usr/bin/env bash` 與 `#!/bin/bash` 的差異和使用方法](/ko/whitedec/2025/12/12/linux-script-first-line-env-vs-bin-bash/)