簡體   English   中英

`;` 和 `&&` 對 Bash 中的變量賦值表達式有什么作用?

[英]What does `;` and `&&` do to variable assignment expressions in Bash?

我對下面的實驗結果很困惑,想更好地理解它:

  1.  root@localhost$ TEST=test env | grep test TEST=test
  2.  root@localhost$ TEST=test && echo ${TEST} test root@localhost$ TEST=test; echo ${TEST} test
  3.  root@localhost$ TEST=test && env | grep test root@localhost$ TEST=test; env | grep test
  4.  root@localhost$ TEST=test && TEST=${TEST} env | grep test TEST=test root@localhost$ TEST=test; TEST=${TEST} env | grep test TEST=test
  5.  root@localhost$ export TEST=test && TEST=${TEST} env | grep test; unset TEST TEST=test root@localhost$ export TEST=test; TEST=${TEST} env | grep test; unset TEST TEST=test

我的主要困惑是:

為什么#3 不起作用?

為什么#4 有效?

有兩種類型的變量:環境(導出)變量和 shell 變量。

  • VAR=val設置名為VAR的環境變量(如果它已經存在)。
  • 如果 env var VAR不存在,則VAR=val設置名為VAR的 shell var。
  • VAR=val cmd cmd名為VAR的環境變量。

環境變量作為其環境提供給子進程。

另一方面,Shell 變量僅存在於該 shell 進程中。 子進程無權訪問它們。

所以,

  1. 您為命令設置了 env var TEST
  2. 您設置 shell var TEST
  3. 您設置 shell var TEST
  4. 您設置 shell var TEST 然后為命令設置 env var TEST
  5. 你環境 shell var TEST 然后為命令設置 env var TEST

為什么#4 有效?

你設置了一個環境變量。

為什么#3 不起作用?

您沒有設置任何環境變量。

@ikegami 的回答很好,他強調了環境變量和 shell 變量之間的區別。 但是我有一些關於 bash 如何將這些長命令拆分並執行到 append 的信息。

對於較長的命令,bash 會將其視為一些較小的命令組件,例如

  • 簡單的命令
  • 管道
  • 命令列表

等等,你可以看看bash手冊

  1. 簡單的命令

    簡單命令是最常見的,實用程序可執行文件(可能帶有參數)是簡單命令,例如示例中的envgrep test 您可以在簡單的命令之前添加一些變量分配,以臨時將 env vars 應用於它,例如TEST=test env Shell 內置命令也是簡單的命令,例如export TEST=test 簡單命令沒有嚴格的定義,我認為從語法上看變量賦值可以看作是簡單命令,但是在另一個簡單命令之前的變量賦值當然不是,它們是臨時的環境變量。

  2. 管道

    管道是一些使用|連接的命令。 ,例如TEST=test env | grep test TEST=test env | grep test ,其中包括兩個簡單的命令。

  3. 命令列表

    命令列表是由運算符分隔的一個或多個管道的序列,例如&& , ; , 等等。 &&意味着只有當前面的管道成功時,后面的管道才會被執行。 ; 意味着所有管道將按順序執行。

例如,#4 的兩個命令都可以被 bash 解釋為以下樹(抽象語法樹):

                               list of commands
                         _____________|______________
                        |                            |
                    pipeline                      pipeline
                        |                      _______|_______
                        |                     |               |
                  simple command    simple command    simple command
                        |                 |                   |
                  TEST=test       TEST=${TEST} env         grep test

Bash 將從左子樹和節點到右子樹和節點執行此樹。 請注意TEST=${TEST} env一個不可分割的命令單元

暫無
暫無

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

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