簡體   English   中英

為單個命令取消設置環境變量

[英]Unset an environment variable for a single command

在 Bash 中,我們可以通過這種方式為單個命令設置環境變量:

FOO=bar somecommand

如果我們想為單個命令取消設置變量怎么辦?

從技術上講,除非有人export它們,否則它們不是環境變量。 但是您至少可以將它們設置為空:

FOO= some command

如果從環境中刪除它們就足夠了,您可以使用env

env -u FOO somecommand
env -u FOO somecommand

這將從somecommand進程的環境中刪除環境變量FOO

並取消設置多個變量:

env -u FOO -u FOO2 somecommand

對於任何打算在沒有環境變量的情況下運行命令的人,您可以通過運行:

env -i somecommand

當“ somecommand ”是一個shell 函數時,這很棘手。

單觸發環境變量賦值,如“ FOO中”“ FOO=bar cmd ”,“的調用期間僅存在cmd ”。
但是,如果 ' cmd ' 恰好是一個 shell 函數,則在執行的 shell 本身中分配了 ' FOO ',並且該分配將一直保留到進程退出(除非明確取消設置)。
由於“ FOO=bar shell_func ”的這種副作用不太可能是故意的,因此應該避免。

為了進一步說明FOO= aCommand的危險性,請考慮 Git 2.26(2020 年第一季度),它避免了“FOO= shell_function (僅針對一個命令shell_function FOO )。

請參閱Jonathan Nieder ( artagnon ) 的commit d6509dacommit a7fbf12commit c7973f2 (2019 年 12 月 26 日
(由Junio C gitster合並-- gitster -- in commit c7372c9 ,2020 年 1 月 30 日)

fetch test : 避免在 shell 函數中使用 "VAR= cmd"

簽字人:喬納森·尼德

就像分配非空值一樣,在調用函數時將空值分配給 shell 變量會產生不可移植的行為:在某些 shell 中,賦值持續到函數調用的持續時間,而在另一些 shell 中,它在函數返回后持續存在.

使用帶有導出的envvar的顯envvar外殼,以使外殼之間的行為保持一致並且非常清晰

此模式的所有先前實例都使用“ VAR=value ”(具有非空value ),自a0a630192d以來已由“make test-lint”自動診斷(t/check-non-portable-shell:檢測“ FOO=bar shell_func ” , 2018-07-13)。

例如,而不是:

GIT_TEST_PROTOCOL_VERSION= trace_fetch client origin to_fetch

使用子shell:

(
    GIT_TEST_PROTOCOL_VERSION= &&
    export GIT_TEST_PROTOCOL_VERSION &&
    trace_fetch client origin to_fetch
) &&
...

暫無
暫無

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

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