gpt4 book ai didi

linux - 这个 bash 片段是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 11:32:58 26 4
gpt4 key购买 nike

通常检查二进制文件是否存在:

if hash gdate 2>/dev/null; then
gdate "$@"
else
date "$@"
fi

从命令行运行时:

vagrant@vagrant-ubuntu-saucy-32:~$ hash gdate 2>/dev/null
vagrant@vagrant-ubuntu-saucy-32:~$ echo $?
1

这意味着如果我运行脚本,将调用 date,因为我的系统上没有 gdate。

那么,这是否意味着上面的代码片段是这样的?

if 1; then
gdate "$@"
else
date "$@"
fi

我认为 1 在 bash 中的计算结果为真,那么,难道不应该选择 if 分支而不是 else 分支吗?有人可以为我分解这段代码吗?

最佳答案

在Unix系统中,退出状态为0表示成功;其他任何事情都是失败的。

这与 test 操作中发生的事情无关。 test 命令也会在条件为真时返回(退出状态为)0,在条件为假时返回 1。


评论和回答

pfnuesel问:

Is this always true? Isn't there C-like evaluation of true/false in some specific cases?

指定一个反例...是的,我相信它总是正确的。运行 [ "$var"!= "value"]; echo $?[[ $var != value ]]; echo $? 或类似的命令组合,看看你得到了什么。

i=0; (( i++ )); echo $?

嗯……很有趣;这绝对让我停下来思考。它使事情复杂化,但是(假设您同意它从 echo $? 产生 1),我认为这意味着 (( 命令正在小心地反转逻辑。如果您在 (( 命令上针对 $i 的各种值运行测试,您会发现当表达式的计算结果为 0 时(就像您的示例中那样,因为它是后增量),则退出状态为 1,为假,否则,退出状态为 0,为真。这适用于 bashksh(我认为这是 ksh 之后的 bash)。

我用这个脚本来帮助自己弄清楚事情:

for start in {-3..3}
do
for shell in bash ksh sh
do
output=$($shell -c "i=$start;"' if (( i++ )); then echo $? true $i; else echo $? false $i; fi')
printf "%-4s %4s %s %-5s %s\n" $shell "[$start]" $output
done
done

输出:

bash [-3] 0 true  -2
ksh [-3] 0 true -2
sh [-3] 0 true -2
bash [-2] 0 true -1
ksh [-2] 0 true -1
sh [-2] 0 true -1
bash [-1] 0 true 0
ksh [-1] 0 true 0
sh [-1] 0 true 0
bash [0] 1 false 1
ksh [0] 1 false 1
sh [0] 1 false 1
bash [1] 0 true 2
ksh [1] 0 true 2
sh [1] 0 true 2
bash [2] 0 true 3
ksh [2] 0 true 3
sh [2] 0 true 3
bash [3] 0 true 4
ksh [3] 0 true 4
sh [3] 0 true 4

有趣的是,POSIX shell语法将 (( 识别为命令的可能性:

If a character sequence beginning with "((" would be parsed by the shell as an arithmetic expansion if preceded by a '$', shells which implement an extension whereby "((expression))" is evaluated as an arithmetic expression may treat the "((" as introducing as an arithmetic evaluation instead of a grouping command. A conforming application shall ensure that it separates the two leading '(' characters with white space to prevent the shell from performing an arithmetic evaluation.

关于linux - 这个 bash 片段是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com