TL; DR:列表分隔符,例如;
。&
,&&
并||
确定解析顺序。
在bash的手册告诉我们:
AND和OR列表是由&&和||分隔的一个或多个管道的序列。分别控制操作员。
或者Bash Hacker的Wiki如何简洁地说明这一点
<PIPELINE1> && <PIPELINE2>
因此,cd ~/screenshots/ && ls screenshot* | head -n 5
其中有一个管道- ls screenshot* | head -n 5
一个简单的命令cd ~/screenshots/
。注意根据手册
管道中的每个命令都作为单独的进程(即,在子Shell中)执行。
另一方面,(cd ~/screenshots/ && ls screenshot*) | head -n 5
情况有所不同-您有一个管道:左侧有subshell,右侧有head -n 5
。在这种情况下,使用OP的符号将是(A && B) | C
让我们再举一个例子:
$ echo foo | false && echo 123 | tr 2 5
$
这里有一个清单<pipeline1> && <pipeline2>
。由于我们知道管道的退出状态与上一个命令相同,并且会false
返回负状态(即失败),&&
因此不会执行右侧操作。
$ echo foo | true && echo 123 | tr 2 5
153
在这里,左侧管道具有成功退出状态,因此右侧管道已执行,我们将看到其输出。
请注意,shell语法并不意味着实际的执行顺序。引用吉尔斯的答案之一:
管道命令同时运行。当您运行ps | grep…,这是运气的好运(或者说是shell的工作细节,再加上调度程序在内核的深处进行了微调)是关于ps还是grep首先开始,无论如何它们都继续同时执行。
从bash手册:
AND和OR列表以左关联性执行。
在此基础上在cd ~/screenshots/ && ls screenshot* | head -n 5
该cd ~/screenshots/
会首先执行,ls screenshot* | head -n 5
如果前面的命令成功,但head -n 5
可能是第一个进程产生的,而不是ls
因为他们是在一个管道。
|
只是一个适合LHS stdout和RHS stdin的连接器可能会有所帮助。因此,如果cd
您的示例中的命令失败,它将不会向发送任何输出head
,但head
实际上仍然会execute
解析任何内容,并且不返回任何输出。