[英]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 d6509da 、 commit a7fbf12 、 commit 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.