如何仅在脚本的持续时间内设置环境变量?

suc*_*ipi 108 linux bash environment-variables

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

Roc*_*ite 94

VAR1=value1 VAR2=value2 myScript args ...
Run Code Online (Sandbox Code Playgroud)

  • @Zibri 这是关于扩张发生的时间。也许你可以这样做: `VAR1="hello" bash -c 'echo $VAR1'` (4认同)
  • 我自己做了很多次才能运行`vblank_mode = 0 glxgears`。它可以工作,但是在运行后还会显示“ vblank_mode = 0:未找到命令”,而在前面加上“ env”不会导致这种情况。[测试...]显然zsh不喜欢它(但仍然可以正确使用它),但是bash可以使用它。我想从现在开始我将使用`env`方法。 (2认同)
  • 使用脚本可以正常工作,但是`VAR1 =“ hello” echo $ VAR1`如何不返回任何内容? (2认同)

gle*_*man 65

env VAR=value myScript args ...
Run Code Online (Sandbox Code Playgroud)

  • 因为shell在执行echo命令之前扩展了PATH变量**.你需要推迟扩展.一种方法:`PATH = $ PATH:XYZ sh -c'echo $ PATH'| grep XYZ` - 单引号是这里的关键 (16认同)
  • 或者``VAR = value myScript args ...` (15认同)
  • 使用`env`和不使用它有什么区别? (12认同)
  • 1.为什么`PATH = $ PATH:XYZ echo $ PATH | grep XYZ`虽然没有任何输出?2.使用和不使用`env`有什么区别? (9认同)
  • @MohammedNoureldin 不是一个完整的答案,但根据我自己的经验,根据 shell 类型,不使用 `env` 会给出错误,而其他 shell 不会给出错误,所以我想总是与 `env` 一起使用会更安全。 (2认同)

Hen*_*olm 27

刚刚放

export HOME=/blah/whatever
Run Code Online (Sandbox Code Playgroud)

在脚本中您希望更改发生的位置.由于每个进程都有自己的一组环境变量,因此当脚本终止时(以及具有更改环境的bash实例),此定义将自动停止具有任何意义.

  • 那是误导.`export`会将变量传递给子shell,但它不控制父shell.如果您正在编写以"#!/ bin/sh"等开头的脚本,则在脚本退出时,您设置的任何变量都将消失. (7认同)
  • @brightlancer:如果OP的脚本调用本身依赖于$ HOME的子脚本,则导出是必要的,我不敢认为_that_不是这种情况.此外,即使脚本没有shebang行,bash也会生成一个子shell来运行脚本,但它只是一个设置了执行位的文本文件.尝试一下 - 脚本中的变量赋值在您调用它的shell中不可见.只有当您明确地"获取"脚本时,它才会被您键入命令的同一个shell执行. (7认同)
  • @brightlancer:如果他希望`$ HOME`被脚本执行的任何命令继承,那么导出是必要的.如果他没有,并且`$ HOME`的设置只是为了脚本本身的好处,那么他可能会更好地修改脚本,因此它指的是除了'$ HOME`之外的其他东西. (4认同)
  • 出口是不必要的.此外,只有当他的脚本调用解释器(#!/ bin/sh等)时,您的答案才有效.如果他的"剧本"没有,那么你刚刚告诉他的内容将会持续到他的剧本结束之后.这就是为什么我说你的回答是误导的 - 它可能是正确的,它可能不是,但它肯定有一部分是不必要的和令人困惑的,因为它可能会导致某人认为"出口"是他正在寻找的必要元素. (3认同)