小编dkv*_*dkv的帖子

在脚本启动后选择解释器,例如在 hashbang 中的 if/else

有没有办法动态选择正在执行脚本的解释器?我有一个在两个不同系统上运行的脚本,我想使用的解释器位于两个系统上的不同位置。我最终不得不在每次切换时更改 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 解释器的路径。

shell shell-script exec shebang interpreter

17
推荐指数
3
解决办法
7263
查看次数

bash - if 语句中的括号有什么作用?

也许这不仅仅适用于 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 在评论中提到的,它似乎实际上也应该失败? )。

linux bash control-flow test

6
推荐指数
1
解决办法
6792
查看次数

标签 统计

bash ×1

control-flow ×1

exec ×1

interpreter ×1

linux ×1

shebang ×1

shell ×1

shell-script ×1

test ×1