如何在執行程序時設置然後取消設置環境變數?
假設我
program
通過設置環境變數來依賴某些配置。現在我也不想用 10 個不同的環境變數污染我的本地環境,所以我認為在這種情況下腳本會很方便:set VAR1=... set VAR2=... . . # run the program ./program unset VAR1 unset VAR2 . .
因此,
./program
我現在將執行此腳本,而不是執行。我的問題是,這是慣用的做事方式嗎?我應該知道更好的方法嗎?
在類似 Bourne 或類似
rc
的 shell 中,要將環境變數傳遞給一個命令的一次呼叫,您可以:VAR1=value VAR2=other-value some-command with its args
儘管請注意,在某些 shell 中, if
some-command
是一個特殊的內置函式(例如export
,set
,eval
)或函式,但之後變數仍保持設置(儘管並不總是導出)。csh 或 tcsh shell 在那些(或任何與此有關的 shell)中沒有等效項,但您始終可以使用以下
env
命令:env VAR1=value VAR2=other-value some-command with its args
env
如果您想傳遞名稱不是有效 shell 變數名稱的環境變數(儘管不建議使用此類變數),您還需要在類似 Bourne 的 shell 中使用,例如:env C++=/usr/bin/g++ some-command with its args
請注意,在 csh 中,
set var=value
設置一個 shell 變數,而不是您需要的環境變數setenv var value
。在
fish
shell 中,您可以set -lx
在begin...end
語句中使用來限制變數的範圍,同時仍將其導出到環境中:begin set -lx VAR1 value set -lx VAR2 other-value some-command with its args end
您可以在
zsh
使用匿名函式時執行相同的操作:(){ local -x VAR1=value VAR2=other-value some-command with its args some-other-command with other args }
或者:
function { local -x VAR1=value VAR2=other-value some-command with its args some-other-command with other args }
VAR1=value VAR2=other-value some-command with its args
儘管如果您想在該環境中執行多個命令,那麼您只會更喜歡標準語法。在任何類似 Bourne 的 shell 中,您還可以使用子 shell 來限制變數賦值的範圍:
( VAR1=value VAR2=other-value export VAR1 VAR2 some-command with its args some-other-command with other args )
POSIX shell(不是 Bourne shell,儘管 Bourne shell 已成為過去)也可以在
export
特殊內置函式的參數中進行賦值:( export VAR1=value VAR2=other-value some-command with its args some-other-command with other args )
該方法也可用於
(t)csh
:( setenv VAR1 value setenv VAR2 other-value some-command with its args some-other-command with other args )
要在使用名稱不是有效 shell 變數名稱的變數啟動的環境中執行多個命令,您始終可以使用start 、
env
或zsh
任何其他不會從環境中刪除這些變數的 shell:bash``csh
# most shell syntax: env C++=/usr/bin/g++ zsh -c ' some-command with its args some-other-command with other args '
# (t)csh syntax env C++=/usr/bin/g++ csh -c '\ some-command with its args\ some-other-command with other args\ '
還要注意
unset
ting 變數(您使用unset var
in (t)csh 和大多數 Bourne-like shellsunset -v var
inbash
,var = ()
inrc
-like shellsset -e var
infish
)與恢復舊變數值不同。在上面的所有範常式式碼之後,只有在最初未設置變數時才會取消設置變數。