我可以有一个有条件的事情吗?

我可以有一个有条件的事情吗?

我有一个可以用不同的解释器运行的脚本:

#!/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不同方式解释一些标记来实现。

  1. 首先,它利用了 docstring 注释标记''',这使得编写过程更加容易。并且'''可以通过添加另一个 轻松在 shell 解释器中忽略它'
  2. 然后,由于两种语法都接受#注释,所以我们可以将其包装起来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

相关内容