2011-08-19 90 views
62

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

+4

如果你想持续_beyond_脚本 – Nemo

回答

15

只要把

export HOME=/blah/whatever 

在您希望的变化发生在脚本的地步。由于每个进程都有自己的一组环境变量,因此当脚本终止时(这个环境变化的bash实例),这个定义将自动停止。

+3

这是误导性的持续时间设置也将很难。 'export'会将变量传递给子壳体,但它不控制父壳体。如果您正在编写以“#!/ bin/sh”或类似内容开头的脚本,则在脚本退出时,您设置的任何变量都将消失。 – brightlancer

+0

@brightlancer,这是真的,但似乎并不矛盾我写的任何东西。 (除了脚本可能启动后台进程的可能性之外,但我认为这超出了OP的复杂程度,只会混淆)。 –

+3

导出是不必要的。此外,只有当他的脚本调用解释器(#!/ bin/sh等)时,您的答案才有效。如果他的“剧本”没有,那么你刚刚告诉他的剧本将会持续到剧本结尾。这就是为什么我说你的答案是误导性的 - 这可能是正确的,也可能不是,但它肯定有一部分是没有必要和令人困惑的,因为它可能导致某人认为“出口”是他寻找的必要元素。 – brightlancer

50
env VAR=value myScript args ... 
+13

或'VAR = value myScript args ...' – Rockallite

+4

1. PATH = $ PATH:XYZ echo $ PATH | grep XYZ'虽然没有任何输出? 2.使用和不使用'env'有什么区别? – qubodup

+9

,因为在**执行echo命令之前,shell会扩展PATH变量**。你需要延迟这种扩展。一种方法:'PATH = $ PATH:XYZ sh -c'echo $ PATH'| grep XYZ' - 单引号是这里的关键 –

53
VAR1=value1 VAR2=value2 myScript args ... 
+1

我自己多次运行'vblank_mode = 0 glxgears'。它可以工作,但它也表示'vblank_mode = 0:command not found'在运行后,而prepend'env'不会导致这种情况。 [测试...]显然zsh不喜欢它(但仍然使用它),但bash罚款。我想我会从现在开始用'env'方法。 –