[英]Command grouping (&&, ||, …)
我們目前在/ home / student /目錄中。 我們執行以下命令:
pwd; (ls) || { cd .. && ls student/; } && cd student || cd / && cd ;
執行的命令是:pwd,ls,cd student,cd /,cd
這是我的想法:
pwd被執行,因為它是第一個命令
(ls)在子shell中執行,因為命令是分開的
用“;”
到目前為止,一切都很清楚,我想。 但我不知道為什么要執行其他命令? 如果有人可以為我分解,我會很感激。
&&
和||
運算符優先級 嚴格來說是從左到右。
從而:
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
無條件地發生(在子殼中)。 cd ..
如果(3)失敗則發生。 ls student/
發生 cd student
就會發生。 cd /
。 cd
。 使用顯式分組操作符是明智的,以避免混淆自己。 避免編寫代碼難以閱讀,因為這更加明智。
(ls)在子shell中執行,因為命令用“;”分隔
由於括號, ls
在子shell中執行。 括號引入子殼。
但我不知道為什么要執行其他命令?
與您可能熟悉的其他編程語言不同,bash不提供&&
比||
更高的優先級 。 它們具有相同的優先權,並從左到右進行評估。
如果你有a || b && c
a || b && c
,在其他語言中,這將被讀作a || {b && c;}
a || {b && c;}
。 如果a
為真,那么b
和c
都不會被評估。
但是在bash中,它被解析為{a || b;} && c
{a || b;} && c
(嚴格的從左到右的優先級),所以當a
為真時,跳過b
但仍然評估c
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.