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解析任何内容,并且不返回任何输出。