簡體   English   中英

命令分組(&&,||,...)

[英]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
  1. pwd無條件地發生
  2. (僅限分組)
  3. ls無條件地發生(在子殼中)。
  4. cd ..如果(3)失敗則發生。
  5. 如果(3)失敗並且(4)成功,則ls student/發生
  6. (僅限分組)
  7. 如果(3)成功或兩者(4)和(5)成功, cd student就會發生。
  8. 如果[(3)和(4)或(5)中的一個失敗]或[(7)失敗],則發生cd /
  9. 如果(7)發生並成功,或(8)發生並成功,則發生cd

使用顯式分組操作符是明智的,以避免混淆自己。 避免編寫代碼難以閱讀,因為這更加明智。

(ls)在子shell中執行,因為命令用“;”分隔

由於括號, ls在子shell中執行。 括號引入子殼。

但我不知道為什么要執行其他命令?

與您可能熟悉的其他編程語言不同,bash不提供&&||更高的優先級 它們具有相同的優先權,並從左到右進行評估。

如果你有a || b && c a || b && c ,在其他語言中,這將被讀作a || {b && c;} a || {b && c;} 如果a為真,那么bc都不會被評估。

但是在bash中,它被解析為{a || b;} && c {a || b;} && c (嚴格的從左到右的優先級),所以當a為真時,跳過b但仍然評估c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM