如何仅在脚本期间设置环境变量?
Posted
技术标签:
【中文标题】如何仅在脚本期间设置环境变量?【英文标题】:How can I set an environment variable only for the duration of the script? 【发布时间】:2011-10-31 00:12:52 【问题描述】:在 Bash 中的 Linux (Ubuntu 11.04 (Natty Narwhal)) 上,是否可以临时设置一个仅在脚本执行期间与普通变量不同的环境变量?
例如,在 shell 脚本中,通过将 HOME 临时设置为当前工作目录中的文件夹,然后启动应用程序,使保存到 HOME 的应用程序可移植。
【问题讨论】:
如果您希望设置持续超过脚本的持续时间 unix.stackexchange.com/questions/126938/… 【参考方案1】:VAR1=value1 VAR2=value2 myScript args ...
【讨论】:
我自己已经做了很多次来运行vblank_mode=0 glxgears
。它可以工作,但它在运行后也会显示vblank_mode=0: command not found
,而前置env
不会导致这种情况。 [测试中...] 显然 zsh 不喜欢它(但仍然正确使用它),但 bash 很好。我想从现在开始我会使用env
方法。
使用脚本它可以工作,但VAR1="hello" echo $VAR1
不返回任何东西怎么样?
@Zibri 它是关于扩张发生的时间。也许你可以这样做:VAR1="hello" bash -c 'echo $VAR1'
赞成证明即使对于多个环境变量也是可能的。
我们可以使用export
来执行此操作,以便变量也保留在子进程中吗?【参考方案2】:
env VAR=value myScript args ...
【讨论】:
或VAR=value myScript args ...
1.为什么PATH=$PATH:XYZ echo $PATH | grep XYZ
没有任何输出? 2、使用env
和不使用有什么区别?
因为 shell 在执行 echo 命令之前扩展了 PATH 变量。您需要延迟该扩展。一种方式:PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ
-- 单引号是这里的关键
使用env
和不使用有什么区别?
这似乎不适用于像IFS=$'\n' for l in lines; do ... done
这样的oneliner【参考方案3】:
随便放
export HOME=/blah/whatever
在脚本中您希望更改发生的位置。由于每个进程都有自己的一组环境变量,因此当脚本终止时(以及环境已更改的 bash 实例),此定义将自动失去任何意义。
【讨论】:
那是误导。export
将变量传递给子shell,但它不控制父shell。如果您正在编写以“#!/bin/sh”或类似名称开头的脚本,则您设置的任何变量都会在脚本退出时消失。
@brightlancer,这是真的,但似乎与我写的任何内容都没有矛盾。 (脚本可能会启动后台进程的可能性除外,但我认为这超出了 OP 的复杂程度,只会造成混淆)。
不需要导出。此外,只有当他的脚本调用解释器(#!/bin/sh 等)时,您的答案才有效。如果他的“剧本”没有,那么你刚刚告诉他的内容将持续到他剧本的结尾。这就是为什么我说您的回答具有误导性 - 它可能是正确的,也可能不是,但它肯定有一部分是不必要的和令人困惑的,因为它可能会导致某人认为“出口”是他正在寻找的必要元素。跨度>
@brightlancer:如果 OP 的脚本调用本身依赖于 $HOME 的子脚本,则导出是必要的,我不敢假设 不是这种情况。此外,即使脚本没有 shebang 行而只是一个设置了执行位的文本文件,bash 也会生成一个子 shell 来运行脚本。试试看——脚本中的变量赋值在你调用它的 shell 中是不可见的。只有当您明确地source
脚本时,它才会由您键入命令的同一 shell 执行。
@brightlancer:如果他希望从脚本执行的任何命令继承$HOME
,则导出是必要的。如果他不这样做,并且$HOME
的设置只是为了脚本本身的利益,那么他可能最好修改脚本,使其引用$HOME
以外的其他内容。以上是关于如何仅在脚本期间设置环境变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 中使用 shell 脚本永久设置环境变量