如何在脚本的运行期间仅设置一个环境变量?

14 浏览
0 Comments

如何在脚本的运行期间仅设置一个环境变量?

在Linux(Ubuntu 11.04(Natty Narwhal))的Bash中,是否可以临时设置一个环境变量,该变量只在脚本运行期间与正常变量不同?

例如,在一个shell脚本中,通过临时将HOME设置为当前工作目录中的一个文件夹,然后启动应用程序,使得应用程序可以在任意位置保存。

0
0 Comments

使用

VAR1=value1 VAR2=value2 myScript args ...

的方式可以在脚本运行期间设置环境变量,但是运行后会出现vblank_mode=0: command not found的错误提示,而在命令前加上env则不会出现此问题。经测试发现,zsh对此方式不友好,但仍能正确使用,而bash则没有问题。所以从现在开始我会使用env方法。

在脚本中使用这种方式是可行的,但是对于VAR1="hello" echo $VAR1这样的命令,却没有返回任何结果。这是因为变量展开的时机不对。可以尝试使用VAR1="hello" bash -c 'echo $VAR1'来解决这个问题。

在这个例子中,展示了如何对多个环境变量进行设置,这是可行的。

问是否可以使用export来使变量在子进程中仍然存在。从这个例子中可以看出,你不需要额外地对变量进行export,它会被子进程继承。例如:VAR1="whoa" bash -c 'sh -c "env | grep VAR1"'

最后,有人犯了一个错误,将这个命令放在了管道的开头,这是不起作用的。可以参考stackoverflow.com/questions/10856129/…寻找解决方法。感谢!

0
0 Comments

在执行脚本时,我们可以使用以下命令设置环境变量:

env VAR=value myScript args ...

或者VAR=value myScript args ...。然而,有一些问题需要解决:为什么PATH=$PATH:XYZ echo $PATH | grep XYZ没有输出结果?使用env和不使用env有什么区别?

问题1:为什么PATH=$PATH:XYZ echo $PATH | grep XYZ没有输出结果?

原因:由于shell在执行echo命令之前扩展了PATH变量,所以没有输出结果。我们需要延迟变量的扩展。

解决方法:PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ,这里的单引号起到了关键作用。

问题2:使用env和不使用env有什么区别?

回答:在一个单行命令中如IFS=$'\n' for l in lines; do ... done,这种方式似乎不起作用。根据我的经验,具体取决于shell类型,使用env而不使用会导致错误,而其他shell则不会报错,所以最好始终使用env以确保安全性。另外,正如其他评论者所指出的,env更灵活,因为它可以在无法访问shell的完整语法的地方使用,并且可以在需要输入单个命令的地方使用。另外,使用env无法影响当前shell的环境。

在执行脚本时,我们可以使用env VAR=value myScript args ...VAR=value myScript args ...命令来设置环境变量。然而,在某些情况下,我们需要延迟变量的扩展,以避免出现问题。此外,在某些情况下,使用env更加灵活,并且可以在无法访问完整语法的地方使用。因此,在脚本中设置环境变量时,建议始终使用env以确保安全性和灵活性。

0
0 Comments

在脚本中设置环境变量仅在脚本执行期间生效的问题可能出现的原因是,脚本中设置的环境变量会在脚本执行结束后消失。如果脚本是以#!/bin/sh或类似命令开头的,那么设置的任何变量都会在脚本退出时消失。

为了解决这个问题,可以在希望发生变化的地方放置

export HOME=/blah/whatever

代码。由于每个进程都有自己的一套环境变量,这个定义在脚本终止时(以及具有更改环境的bash实例)会自动失去任何意义。

然而,export命令会将变量传递给子shell,但不会控制父shell。因此,如果脚本没有调用解释器(#!/bin/sh或类似命令),那么你刚刚告诉他的变量将在脚本结束后仍然存在。这是我说你的答案是误导性的原因之一 - 它可能是正确的,也可能不正确,但它肯定有一个是不必要和令人困惑的部分,因为它可能会让某人认为"export"是他正在寻找的必要元素。

因此,如果OP的脚本调用了依赖于$HOME的子脚本,那么export是必要的。此外,即使脚本没有shebang行,只是一个设置了执行位的文本文件,bash也会生成一个子shell来运行脚本。尝试一下 - 脚本中的变量赋值在调用它的shell中是不可见的。只有当你显式地source脚本时,它才会由你键入命令的同一个shell执行。

在这些情况下,你是正确的,除非你假设了他如何运行他的脚本以及export在其中扮演的角色。这就是我说它具有误导性的原因。

如果OP只希望脚本自身受益于设置的$HOME变量,那么修改脚本,使其引用除$HOME以外的其他内容可能会更好。

总之,如果需要在脚本执行期间设置一个环境变量,可以使用export命令。但是需要注意,如果脚本调用了其他命令或子脚本,而这些命令或子脚本需要继承该环境变量,那么export是必要的。另外,如果脚本没有调用解释器,那么设置的环境变量将在脚本退出后仍然存在。

0