【发布时间】:2021-10-26 12:34:36
【问题描述】:
在fish shell、&& 和and 中似乎表现相同。它们完全一样吗?是否存在它们行为不同的极端情况?
【问题讨论】:
-
我在提问之前阅读了它,但我并不清楚。 “并且,或者是工作修饰符并且具有较低的优先级”?。这是否意味着
and和or的优先级低于&&和||。
在fish shell、&& 和and 中似乎表现相同。它们完全一样吗?是否存在它们行为不同的极端情况?
【问题讨论】:
and 和or 的优先级低于&& 和||。
虽然它们用于同一件事,但它们有着根本的不同:
sh && 是一个二元运算符,它接受两个命令,运行第一个命令,只有成功时才运行第二个命令。如果失败则退出状态为第一个命令,否则退出状态为第二个命令。
fish and 是一个一元运算符,它接受单个命令,如果 $status 为 0 则运行它。如果运行,退出状态由命令选择性地修改。
在这里你可以看到arity的区别:
$ fish -c 'and echo true'
true
$ sh -c '&& echo true'
sh: 1: Syntax error: "&&" unexpected
在这里您可以看到and 如何对不在它之前的命令进行操作:
$ fish -c 'false; set x 1; and echo true'
(no output)
$ sh -c 'false; x=1 && echo true'
true
【讨论】:
and/&& 和or/|| 和not/! 是一样的,除了运算符优先级和是否可以换行。
想象一下:
echo 1 || echo 2; and echo 3
|| 首先绑定,所以echo 1 || echo 2 被认为是一回事。它打印“1”,成功所以它跳过打印“2”,然后因为||整体成功打印“3”。
虽然
echo 1; or echo 2 && echo 3
将只打印“1”。 echo 1 成功,所以其余的都被忽略了。
还有“;”对于; and 和; or 可以换行,而&& 和|| 不能换行(不转义上一行的结尾):
# valid
echo 1
and echo 2
# invalid
echo 1
&& echo 2
# valid - note the `\` is the last thing on the line
echo 1 \
&& echo 2
除了那些东西(和任何错误)之外,这些都是一样的。
【讨论】: