有没有办法动态选择正在执行脚本的解释器?我有一个在两个不同系统上运行的脚本,我想使用的解释器位于两个系统上的不同位置。我最终不得不在每次切换时更改 hashbang 行。我想做一些与此逻辑等效的事情(我意识到这种确切的构造是不可能的):
if running on system A:
#!/path/to/python/on/systemA
elif running on system B:
#!/path/on/systemB
#Rest of script goes here
Run Code Online (Sandbox Code Playgroud)
或者更好的是这样,以便它尝试使用第一个解释器,如果没有找到,则使用第二个解释器:
try:
#!/path/to/python/on/systemA
except:
#!path/on/systemB
#Rest of script goes here
Run Code Online (Sandbox Code Playgroud)
显然,我可以
根据我所在的位置/path/to/python/on/systemA myscript.py
或
/path/on/systemB myscript.py
根据我所在的位置来执行它
,但我实际上有一个启动的包装脚本myscript.py
,所以我想以编程方式而不是手动指定 python 解释器的路径。
也许这不仅仅适用于 bash,但我对括号在 if 语句中的作用感到困惑。大多数示例似乎具有以下格式
if [ expression ]; then
#do stuff
fi
Run Code Online (Sandbox Code Playgroud)
但这并不总是对我有用。例如,我有以下脚本test.sh
:
#!/bin/bash
flag=False
if ! $flag; then
echo "No brackets: Flag is $flag"
fi
if [ ! $flag ]; then
echo "With brackets: Flag is $flag"
fi
echo "The end."
Run Code Online (Sandbox Code Playgroud)
哪个打印
$ ./test.sh
No brackets: Flag is False
The end.
Run Code Online (Sandbox Code Playgroud)
所以使用方括号的语句要么被忽略,要么被评估为 False。为什么会发生这种情况?括号有什么作用?
我也见过双括号。那些是怎么用的?
——
编辑:声称重复的问题(这个和这个)只回答了这个问题的一小部分。我仍然不清楚为什么带括号的语法会失败(在我看来test ! false
应该计算为true
)以及为什么没有括号的语法会成功(尽管正如@ilkkachu 在评论中提到的,它似乎实际上也应该失败? )。
bash ×1
control-flow ×1
exec ×1
interpreter ×1
linux ×1
shebang ×1
shell ×1
shell-script ×1
test ×1