將 Python 腳本變成一個「命令」{#sec-e5db7dc8c348}



#!/usr/bin/env python3

大家在 Linux 上編寫 Python 腳本時,都知道可以在第一行加上像 #!/usr/bin/env python3 這樣的 shebang 嗎? 然而,許多人似乎不喜歡特別加上 shebang。他們可能認為:「這不過是省去輸入 python3 這個命令的麻煩罷了,那點功夫自己打字就行了。」

如果只是說「少打一點字的便利功能」,坦白說,這沒什麼吸引力。 但如果換個說法,情況就完全不同了。

「將我的 Python 程式碼偽裝成 Linux 原生命令的技巧」

這聽起來是不是有點誘人呢?

在 Linux 中,使用 Python 腳本的 pi-pi 處理流程圖


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 命令

感覺我的程式碼可以與 lsgrepawk 並駕齊驅

這就是第一種快感。


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,並在終端機中直接輸入你的程式碼名稱吧。 那時指尖感受到的,就是這項技術的本質。

延伸閱讀