[英]What does `;` and `&&` do to variable assignment expressions in Bash?
我對下面的實驗結果很困惑,想更好地理解它:
root@localhost$ TEST=test env | grep test TEST=test
root@localhost$ TEST=test && echo ${TEST} test root@localhost$ TEST=test; echo ${TEST} test
root@localhost$ TEST=test && env | grep test root@localhost$ TEST=test; env | grep test
root@localhost$ TEST=test && TEST=${TEST} env | grep test TEST=test root@localhost$ TEST=test; TEST=${TEST} env | grep test TEST=test
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
的環境變量(如果它已經存在)。VAR
不存在,則VAR=val
設置名為VAR
的 shell var。VAR=val cmd
cmd
名為VAR
的環境變量。環境變量作為其環境提供給子進程。
另一方面,Shell 變量僅存在於該 shell 進程中。 子進程無權訪問它們。
所以,
TEST
。TEST
。TEST
。TEST
。 然后為命令設置 env var TEST
。TEST
。 然后為命令設置 env var TEST
。為什么#4 有效?
你設置了一個環境變量。
為什么#3 不起作用?
您沒有設置任何環境變量。
@ikegami 的回答很好,他強調了環境變量和 shell 變量之間的區別。 但是我有一些關於 bash 如何將這些長命令拆分並執行到 append 的信息。
對於較長的命令,bash 會將其視為一些較小的命令組件,例如
等等,你可以看看bash手冊。
簡單的命令
簡單命令是最常見的,實用程序可執行文件(可能帶有參數)是簡單命令,例如示例中的env
和grep test
。 您可以在簡單的命令之前添加一些變量分配,以臨時將 env vars 應用於它,例如TEST=test env
。 Shell 內置命令也是簡單的命令,例如export TEST=test
。 簡單命令沒有嚴格的定義,我認為從語法上看變量賦值可以看作是簡單命令,但是在另一個簡單命令之前的變量賦值當然不是,它們是臨時的環境變量。
管道
管道是一些使用|
連接的命令。 ,例如TEST=test env | grep test
TEST=test env | grep test
,其中包括兩個簡單的命令。
命令列表
命令列表是由運算符分隔的一個或多個管道的序列,例如&&
, ;
, 等等。 &&
意味着只有當前面的管道成功時,后面的管道才會被執行。 ;
意味着所有管道將按順序執行。
例如,#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.