如何仅在脚本期间设置环境变量?


127

在bash的Linux(Ubuntu 11.04)上,是否可以临时设置一个环境变量,该环境变量在脚本持续时间内仅与普通变量不同?例如,在Shell脚本中,通过将HOME临时设置为当前工作目录中的文件夹,然后启动该应用程序,使可保存到HOME的应用程序可移植。


5
如果您希望该设置持续到脚本持续时间之外,则会更困难
Nemo11,2008年

Answers:


119
VAR1=value1 VAR2=value2 myScript args ...

2
我已经无数次地这样做了vblank_mode=0 glxgears。它可以工作,但是vblank_mode=0: command not found在运行后也会显示,而前置env不会导致这种情况。[测试...]显然zsh不喜欢它(但仍然可以正确使用它),但是bash可以使用它。我想env从现在开始我将继续使用该方法。
Chinoto Vokro

2
使用脚本可以正常工作,但是 VAR1="hello" echo $VAR1不返回任何内容吗?
Zibri

2
@Zibri是关于何时进行扩展。可能您可以执行以下操作:VAR1="hello" bash -c 'echo $VAR1'
cybergrind

为表明即使对于多个环境变量也可以做到这一点而表示敬意。
Binarus

70
env VAR=value myScript args ...

18
VAR=value myScript args ...
Rockallite 2014年

9
1.为什么PATH=$PATH:XYZ echo $PATH | grep XYZ没有任何输出?2.使用和不使用有env什么区别?
qubodup 2015年

18
因为外壳程序执行echo命令之前会扩展PATH变量。您需要延迟该扩展。一种方式:PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ-单引号是关键
格伦·杰克曼

14
使用env和不使用之间有什么区别?
Mohammed Noureldin

这似乎并没有工作在oneliner像IFS=$'\n' for l in lines; do ... done
drevicko

31

刚放

export HOME=/blah/whatever

在脚本中您希望更改发生的位置。由于每个进程都有其自己的环境变量集,因此在脚本终止时(并且随之而来的是环境已更改的bash实例),此定义将自动失去任何意义。


11
这是误导。export会将变量传递给子shell,但它不控制父shell。如果您正在编写以“#!/ bin / sh”等开头的脚本,则退出脚本时,您设置的任何变量都会消失。
Brightlancer 2011年

1
@brightlancer,是的,但这似乎与我写的内容并不矛盾。(除了脚本可能启动后台进程的可能性之外,但我认为这超出了OP的复杂程度,只会造成混淆)。
hmakholm在2011年

5
导出是不必要的。同样,只有当他的脚本调用解释器(#!/ bin / sh等)时,您的答案才有效。如果他的“脚本”不存在,那么您刚刚告诉他的内容将持续到脚本结尾。这就是为什么我说您的答案具有误导性的原因-可能是正确的,可能不是,但是绝对有一部分是不必要的和令人困惑的,因为它可能使某人认为“出口”是他正在寻找的必要要素。
Brightlancer

7
@brightlancer:出口是必要的,如果OP的脚本调用子脚本本身依赖于$ HOME,我不敢设想的是,情况并非如此。此外,bash会生成一个子外壳来运行脚本,即使该脚本没有shebang行,而仅仅是设置了execute位的文本文件。尝试一下-脚本中的变量分配在调用它的shell中不可见。仅当您显式地source将由键入命令的外壳程序执行该脚本时,该脚本才会执行。
hmakholm在2011年

4
@brightlancer:如果导出希望$HOME被脚本执行的任何命令继承,则必须导出。如果他不这样做,并且的设置$HOME仅是出于脚本本身的利益,那么他最好修改该脚本,以便它引用的不是$HOME
基思·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.