為什麼沒有設置這個環境變數?
- 當 shell 將外部執行檔作為命令執行時,我們可以將環境變數傳遞給執行檔。
$ var=3 /bin/echo `$var` $ var=3 bash -c "/bin/echo '$var'"
兩者都不輸出任何東西。 2. 當一個程序由 執行時
exec
,我想看看環境變數是否也有效:$ bash $ unset var; $ var=3 exec /bin/echo '$var' $var $ exec var=3 /bin/echo '$var' bash: exec: var=3: not found
為了防止變數擴展,我在
$var
. 保護似乎有點過分了。為什麼在上述情況下沒有設置這個環境變數?
我可以使環境變數適用於由 執行的程序
exec
嗎?謝謝。
您所有的問題都與報價有關,而不是與環境有關。
- 命令的環境。
> > 當 shell 將外部執行檔作為命令執行時,我們可以將環境變數傳遞給執行檔。 > > >是的,這是一種為外部或其他命令設置環境變數的方法。
但是您在這一行中缺少什麼$$ a $$:
$ var=3 /bin/echo "$var"
是shell在建構參數時擴展了變數,如果變數
var
沒有在啟動命令的shell中設置,這就是實際執行的:$ var=3 /bin/echo ""
要實際查看目前的 shell 擴展,請執行以下命令:
$ var=RunningShell ; var=3 /bin/echo "$var" RunningShell
延遲變數評估的一種(通常是不安全的)方法是:
$ var=3 eval /bin/echo '"$var"' 3
在第二個範例中,您交換了引號:
$ var=3 bash -c "/bin/echo '$var'"
當實際的命令行變為:
$ var=3 bash -c "/bin/echo ''"
隨著(未設置)變數 $var 的值被擴展。你可能是這個意思:
$ var=thisis3 bash -c '/bin/echo "$var"' thisis3
在這種情況下,單引號會阻止執行 shell 擴展變數,將擴展留給執行的 shell (
bash -c
)。
使用 env 實際查看環境。
- 當一個程序由 exec 執行時,我想看看環境變數是否也有效:不要在您目前的 shell 中執行,因為它會關閉正在執行的 shell。
您可以這樣做以避免關閉正在執行的 shell:
$ var=3 exec /bin/echo \$var | cat $var
由於封閉的外殼將是無論如何都會關閉的外殼,因此是管道的第一個子外殼。
但這不會向您顯示環境中 var 的值。要查看環境中的變數,請使用命令查看環境:
$ var=3 env | grep var var=3
$$ a $$ 您編寫的命令有反引號```,將它們更改為單引號將避免變數的擴展並列印
$var
.:$ var=3 /bin/echo '$var' $var
請記住,參數擴展不會神奇地發生,您需要一個 shell 來為您完成。
var=3 /bin/echo `$var`
我不確定你想用那個做什麼,反引號在這裡不合適(它們執行一個命令並被它的輸出替換)。
var=3 bash -c "/bin/echo '$var'"
不起作用,因為參數擴展發生在賦值之前,因此目前 shell 更改
"/bin/echo '$var'"
為/bin/echo ''
(假設var
未定義),並且子 shell 執行/bin/echo ''
嘗試
var=3 bash -c 'echo $var'
相反:這裡的單引號保護目前shell的參數,並且新的shell執行
echo $var
它將按照您的預期進行處理。
在您的第二點中,我最初的評論仍然適用。如果您想玩轉環境並查看會發生什麼,請執行
env
並過濾其輸出:var=3 env | grep var var=3 exec env | grep var