myt*_*hic 7 syntax bash operator-precedence
我们目前在/ home/student /目录中.我们执行以下命令:
pwd; (ls) || { cd .. && ls student/; } && cd student || cd / && cd ;
Run Code Online (Sandbox Code Playgroud)
执行的命令是:pwd,ls,cd student,cd /,cd
这是我的想法:
pwd被执行,因为它是第一个命令
(ls)在子shell中执行,因为命令
用";" 分隔
到目前为止,一切都很清楚,我想.但我不知道为什么要执行其他命令?如果有人可以为我分解,我会很感激.
Cha*_*ffy 15
运算符优先级为&&和||严格从左到右.
从而:
pwd; (ls) || { cd .. && ls student/; } && cd student || cd / && cd ;
Run Code Online (Sandbox Code Playgroud)
......相当于......
pwd; { { { (ls) || { cd .. && ls student/; }; } && cd student; } || cd /; } && cd ; }
Run Code Online (Sandbox Code Playgroud)
......以图形方式打破这种情况:
pwd; { # 1
{ # 2
{ (ls) || # 3
{ cd .. && # 4
ls student/; # 5
}; # 6
} && cd student; # 7
} || cd /; # 8
} && cd ; # 9
Run Code Online (Sandbox Code Playgroud)
pwd 无条件地发生ls 无条件地发生(在子壳中).cd .. 如果(3)失败,就会发生.ls student/ 如果(3)失败并且(4)成功则发生cd student 如果(3)成功或两者(4)和(5)都成功,则会发生.cd / 如果[(3)和(4)或(5)中的一个失败]或[(7)失败]发生.cd 如果(7)发生并成功,或(7)发生并成功,则发生.使用显式分组操作符是明智的,以避免混淆自己.避免编写代码难以阅读,因为这更加明智.
(ls)在子shell中执行,因为命令以“;”分隔
ls由于括号而在子shell中执行。括号会引入子外壳。
但是我不知道为什么要执行其他命令?
与您可能熟悉的其他编程语言不同,bash的&&优先级比更高||。它们具有相同的优先级,并且从左到右进行评估。
如果您有a || b && c其他语言,则将其读为a || {b && c;}。如果a是真,那么既不b也c将进行评估。
但是,在bash中,它被解析为{a || b;} && c(严格的从左到右的优先级),因此,当atrue b为true 时将被跳过,但c仍会进行评估。