"&&" 是否完全等同于 fish shell 中的 "and"?

is "&&" exactly equivalent to "and" in fish shell?

fish shell 中,&&and 似乎表现相同。它们完全一样吗?是否存在它们表现不同的极端情况?

虽然它们用于同一件事,但它们在根本上是完全不同的:

sh && 是一个二元运算符,它接受两个命令,运行s 第一个,只有成功时,运行s 第二个。如果失败则退出状态为第一个命令,否则为第二个命令。

fish and 是一个接受单个命令的一元运算符,如果 $status 为 0,则 运行s 它。退出状态可选择由命令修改,如果 运行.

在这里你可以看到数量上的差异:

$ 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 成功,因此其余部分将被忽略。

还有“;” for ; 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

除了那些东西(和任何错误),这些都是一样的。