我可以有条件的shebang吗?

mar*_*cio 10 linux shebang

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

#!/usr/bin/env default-interpreter
[my script]
Run Code Online (Sandbox Code Playgroud)

但我想使用alternative-interpreter它,如果它可用,就像这样:

#!/usr/bin/env alternative-interpreter
[my script]
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个shebang来查找alternative-interpreter并回退到default-interpreter第一个不可用的情况?

Old*_*Guy 5

不直接,不。最好编写一个包装器 Bourne shell 脚本和 shebang :

#!/path/to/my/wrapper
Run Code Online (Sandbox Code Playgroud)

包装器以:

#!/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
Run Code Online (Sandbox Code Playgroud)

这让 env(1) 使用 ${PATH} 搜索列表来定位程序,按照 for 循环中给出的顺序。