bash和zsh中&& vs&的优先级


9

回答这个问题,我发现行为之间一个非常有趣的(和微妙的)差别bashzsh

bash

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

如您所见,别名的执行x是在子外壳中进行的,因此当前目录不会更改。

不在zsh

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A >/dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

此处目录已更改。

似乎&in bash的优先级不同于zsh---我的意思是,该命令似乎被读为

(cd /tmp && echo A) & 

bash和作为

cd /tmp && (echo A &) 

zsh。这是正确的还是导致另一种行为的原因?

Answers:


9

记录的不同行为 zshmisc

列表是零个或多个子列表,其中每个子列表被终止的序列;&&|&!,或换行。当列表显示为(...)或中的复杂命令时,可以选择从列表的最后一个子列表中省略此终止符{...}。当子列表由;或换行符终止时,shell将等待其完成后再执行下一个子列表。如果子列表以&&|或终止&!,则外壳程序将在后台执行其中的最后一个管道,并且不等待其完成(请注意与其他外壳程序在后台执行整个子列表的区别)。后台管道返回零状态。


3

嵌入zshmisc(1)以下行:

如果子列表以&',&|'或`&!' 终止,则Shell会在后台执行其中的最后一个管道,

尽管没有具体说明子列表中的其他管道是在当前shell中执行的,但这似乎暗示了它的含义,并且您观察到的行为支持了这种解释。例如:

$ echo $foo $bar

$ foo=3 && bar=5 && sleep 1 &
$ echo $foo $bar
3 5

还支持以下概念:前两个管道在当前shell中执行,而子列表的最后一个管道实际上在后台执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.