Shell-Script

如何在我的 shebang 中使用環境變數?

  • November 30, 2021

我有一個 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 …

Rosetta 程式碼在其他幾種語言中都有這樣的雙語言腳本。

引用自:https://unix.stackexchange.com/questions/20880