Bash

為什麼忽略命令前的變數賦值?

  • October 9, 2014

bash 4.1 聯機幫助頁狀態*(已添加重點)* …

簡單命令

一個簡單的命令是一系列可選的變數賦值,後跟空格分隔的單詞和重定向,並由控制操作符終止。第一個指定要執行的命令,並作為參數零傳遞。剩餘的單詞作為參數傳遞給呼叫的命令。

驗證我係統上的版本*(未針對 shellshock 進行修補)* …

#  bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...

但是,沒有分號的前面的變數分配應該是一種僅在該命令呼叫的生命週期內本地化環境變數值的方法,但似乎並不…

#  x=123 echo $x; unset x; echo $x
bash: x: unbound variable
#  x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
#  x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
#  x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable

解決方案

根據另一個問題的這個答案,該命令似乎必須故意使用其父級的環境變數,而echo不是。但是 shell 呼叫就像bash -c

x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable

資源

這條線

x=123 echo $x

按以下順序評估:

  1. $x``x目前shell中擴展為 的值。
  2. x在要執行的命令的環境中的值設置為123
  3. 擴展命令行搜尋命令,並echo找到。
  4. echo``x在設置為 123的環境中執行,並$1設置為步驟 1 中的任何值x
  5. echo輸出$1到標準輸出,否則忽略其環境中的其他值。

請注意,作為參數與命令之前的$x參數是分開的。x

引用自:https://unix.stackexchange.com/questions/160189