在鱼壳中,&&
和and
的行为似乎相同。它们完全一样吗?它们的行为是否存在不同的边缘情况?
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
除了这些事情(和任何错误),它们是一样的。
虽然它们用于相同的事情,但它们在本质上是完全不同的:
sh&&
是一个二进制操作符,它接受两个命令,运行第一个命令,只有当它成功时才运行第二个命令。退出状态为第一个命令的退出状态,如果失败,则为第二个命令的退出状态。
fishand
是一个一元操作符,它接受单个命令,并在$status
为0时运行该命令。如果运行,可以通过命令修改退出状态。
在这里你可以看到差异的大小:
$ 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