Environment-Variables

如何在執行程序時設置然後取消設置環境變數?

  • August 18, 2021

假設我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 中, ifsome-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

fishshell 中,您可以set -lxbegin...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 、envzsh任何其他不會從環境中刪除這些變數的 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\
'

還要注意unsetting 變數(您使用unset varin (t)csh 和大多數 Bourne-like shells unset -v varin bashvar = ()in rc-like shells set -e varin fish)與恢復舊變數值不同。在上面的所有範常式式碼之後,只有在最初未設置變數時才會取消設置變數。

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