【发布时间】:2009-11-12 10:26:20
【问题描述】:
我目前正在寻找一种通过简单的 shell 脚本在 Linux 中设置环境变量的方法。在脚本中,我目前正在使用“导出”命令,但是这仅在脚本中具有需要系统范围范围的范围。
我是否可以通过 shell 脚本执行此操作,还是需要使用其他方法?
【问题讨论】:
标签: linux shell environment-variables
我目前正在寻找一种通过简单的 shell 脚本在 Linux 中设置环境变量的方法。在脚本中,我目前正在使用“导出”命令,但是这仅在脚本中具有需要系统范围范围的范围。
我是否可以通过 shell 脚本执行此操作,还是需要使用其他方法?
【问题讨论】:
标签: linux shell environment-variables
当您运行 shell 脚本时,它会在子 shell 中执行。您需要的是在当前 shell 的上下文中执行它,通过以下方式对其进行采购:
source myshell.sh
或:
. myshell.sh
后者是我的首选方法,因为我天生懒惰。
如果您谈论的是系统范围的范围,因为您想影响每个人,您需要将您的命令放在登录时(或外壳创建时)获取它们的位置,/etc/profile例如。您将命令放在哪里取决于所使用的 shell。
您可以通过检查您的 shell 的 man 页面来了解执行了哪些脚本:
man bash
bash shell,当作为登录 shell(包括作为非登录 shell,但带有 --login 参数)调用时,将使用 /etc/profile 和 ~/.bash_profile、~/.bash_login 或 @ 中的第一个987654331@.
非登录 bash shells 将使用。除非使用--norc 或--rcfile <filename> 调用,否则文件/etc/bash.bashrc 和~/.bashrc。
我很确定它甚至更多复杂,具体取决于外壳的运行方式,但就我的记忆而言。 man 页面应该详细说明。
【讨论】:
您可以让您的脚本检查诸如 /var/myprog/env-vars-to-load 之类的东西是否存在,并“源”它,然后如果它存在则取消链接,可能使用陷阱和信号。很难说,我对你的程序不熟悉。
没有办法将环境变量“注入”到另一个进程的地址空间中,因此您必须找到某种 IPC 方法来指示进程设置什么。
【讨论】:
环境变量的一个基本方面是您不能影响任何进程的环境,但您自己和您生成的子进程除外。您不能创建一个脚本来设置“系统范围”的环境变量,而这些环境变量以某种方式可以被其他进程使用。
【讨论】:
在 shell 提示符下:
$ source script.sh
并在 script.sh 中设置环境变量
【讨论】:
test.sh
#!/bin/bash
echo "export MY_VAR=STACK_OVERFLOW" >> $HOME/.bashrc
. $HOME/.bashrc
sh task.sh
task.sh
#!/bin/sh
echo $MY_VAR
添加可执行权限:
chmod +x test.sh task.sh
然后启动 test.sh
./test.sh
结果:
STACK_OVERFLOW
【讨论】: