Shell-Script
如何在我的 shebang 中使用環境變數?
我有一個 Python 腳本,需要使用特定的 python 安裝執行。有沒有辦法製作一個 shebang 讓它執行
$FOO/bar/MyCustomPython
?
shebang線非常有限。在許多 unix 變體(包括 Linux)下,您只能有兩個詞:一個命令和一個參數。通常也有長度限制。
一般的解決方案是編寫一個小的 shell 包裝器。命名 Python 腳本
foo.py
,並將 shell 腳本放在旁邊foo.py
並呼叫它foo
。這種方法不需要 Python 腳本上有任何特定的標頭。#!/bin/sh exec "$FOO/bar/MyCustomPython" "$0.py" "$@"
另一種誘人的方法是編寫一個像上面那樣的包裝腳本,並將
#!/path/to/wrapper/script
作為 shebang 行放在 Python 腳本上。但是,大多數 unice 不支持 shebang 腳本的連結,所以這不起作用。如果
MyCustomPython
在 中$PATH
,您可以使用env
它來查找:#!/usr/bin/env MyCustomPython import …
另一種方法是讓腳本既是有效的 shell 腳本(在自身上傳入正確的 Python 解釋器)又是目標語言的有效腳本(這裡是 Python)。這需要您找到一種方法來為您的目標語言編寫這樣的雙語腳本。在 Perl 中,這稱為
if $running_under_some_shell
.#!/bin/sh eval 'exec "$FOO/bar/MyCustomPerl" -wS $0 ${1+"$@"}' if $running_under_some_shell; use …
這是在 Python 中實現相同效果的一種方法。在 shell 中,
"true"
是true
實用程序,它忽略其參數(兩個單字元串:
和'
)並返回一個真值。在 Python 中,"true"
是一個字元串,當解釋為布爾值時為真,因此這是一條if
始終為真並執行字元串文字的指令。#!/bin/sh if "true" : '''\' then exec "$FOO/bar/MyCustomPython" "$0" "$@" exit 127 fi ''' import …