我有一个可以用不同的解释器运行的脚本:
#!/usr/bin/env default-interpreter
[my script]
alternative-interpreter
但如果可用的话我想使用它,如下所示:
#!/usr/bin/env alternative-interpreter
[my script]
有没有办法创建一个 shebang,当第一个不可用时,它会寻找alternative-interpreter
并返回?default-interpreter
答案1
不是直接的,不是。最好写一个包装器 Bourne shell 脚本并执行以下任务:
#!/path/to/my/wrapper
包装器以以下内容开头:
#!/bin/sh
for shell in first second third; do
if /usr/bin/env "${shell}" "$@"; do exit $?; done
done
# We didn't find any of them.
exit 1
这让 env(1) 使用 ${PATH} 搜索列表按照 for 循环中给出的顺序来定位程序。
答案2
python|python3|python2
这是使用最先可用的脚本运行 Python 脚本的示例。
这可以通过以python|shell
不同方式解释一些标记来实现。
- 首先,它利用了 docstring 注释标记
'''
,这使得编写过程更加容易。并且'''
可以通过添加另一个 轻松在 shell 解释器中忽略它'
。 - 然后,由于两种语法都接受
#
注释,所以我们可以将其包装起来EOF
,#
即#EOF
,这在 shell 解释器和 python 解释器中都是语法正确和功能正确的。
甚至,你可以使用以下命令安全地传递所有参数"$@"
:
#!/bin/sh
#crafted to dynamically select python version, while keeping the script part fully compatible to python syntax so it won't break any IDE/syntax highlighting.
'''w'hich python>/dev/null && PYTHON_EXE=`which python` || { which python3>/dev/null && PYTHON_EXE=`which python3`; } || { which python2>/dev/null && PYTHON_EXE=`which python2`; } || { echo python is not available in PATH!; exit 1; }
$PYTHON_EXE - "$@" <<EO'F'''
#!/usr/bin/env python
import sys
print("Hello World")
print(sys.argv)
#EOF