我们目前在/ home / student /目录中。我们执行以下命令:
pwd; (ls) || { cd .. && ls student/; } && cd student || cd / && cd ;
执行的命令是: pwd,ls,cd student,cd /,cd
以下是我的想法:
执行pwd,因为它是第一个命令
(ls)在子shell中执行,因为命令是分开的 与";"
到目前为止,一切都很清楚,我想。但我不知道为什么要执行其他命令?如果有人可以为我分解,我会很感激。
答案 0 :(得分:13)
&&
和||
的运算符优先顺序是从左到右。
因此:
pwd; (ls) || { cd .. && ls student/; } && cd student || cd / && cd ;
......等同于......
pwd; { { { (ls) || { cd .. && ls student/; }; } && cd student; } || cd /; } && cd ; }
......以图形方式打破这一点:
pwd; { # 1
{ # 2
{ (ls) || # 3
{ cd .. && # 4
ls student/; # 5
}; # 6
} && cd student; # 7
} || cd /; # 8
} && cd ; # 9
pwd
无条件地发生ls
无条件地发生(在子shell中)。cd ..
。ls student/
cd student
。cd /
。cd
。使用显式分组操作符是明智的,可以避免让自己感到困惑。避免将代码编写为难以阅读,因为这更加明智。
答案 1 :(得分:5)
由于括号,(ls)在子shell中执行,因为命令是分开的 与";"
ls
在子shell中执行。括号引入子壳。
但我不知道为什么要执行其他命令?
与您可能熟悉的其他编程语言不同,bash不会优先&&
优先于||
。它们具有相同的优先权,并从左到右进行评估。
如果您有a || b && c
,则在其他语言中,这将被视为a || {b && c;}
。如果a
为真,那么b
和c
都不会被评估。
但是,在bash中,它被解析为{a || b;} && c
(严格的从左到右的优先顺序),因此当a
为真时b
被跳过但{{1}仍在评估中。