Bash

為什麼沒有設置這個環境變數?

  • August 8, 2017
  1. 當 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嗎?

謝謝。

  • 您所有的問題都與報價有關,而不是與環境有關。

    1. 命令的環境。

    > > 當 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 實際查看環境。

    1. 當一個程序由 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

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