打开/关闭环境变量

时间:2013-12-02 19:03:18

标签: linux bash shell environment-variables

我一直在尝试将$PATH环境变量设置为指向我需要的不同路径,但我遇到了一些问题。

主要的是当我将PATH设置为指向我需要的服务时,我希望它在所有后续的bash shell中保持这种状态。也就是说,当我打开另一个bash shell时,它也将被设置在那里,直到我决定将其切换回来。当我将PATH切换回原始值时。我希望它保持这种状态。

我在.bashrc中添加了一个小脚本,我还尝试了一个单独的脚本来改变环境变量。但问题仍然存在:如果我打开一个新的bash shell,它会继承默认的环境变量和默认的PATH。

我正在设置这些以启用守护程序服务。我尝试打开/关闭服务本身。这不起作用,因为必须更改路径,否则shell将尝试使用这些环境路径,但是关闭它的服务将会挂起。

我尝试运行一个小的C程序包装器来做这些事情,但我遇到了同样的问题。

2 个答案:

答案 0 :(得分:1)

为了使shell会话中存在环境变量,您需要将这些变量放入shell配置文件中。这通常在~/.bashrc~/.profile中完成(如果您使用的是Bash)。例如,在我的~/.profile文件中,我有:

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

我可以根据需要添加到该路径。最后的$PATH变量将附加路径中的当前值。

如果您需要脚本来访问变量,则应将PATH放入.bashrc文件中。 (what is the difference between .bashrc and .profile

如果您对其中一个shell配置文件进行了更改,则在再次使用这些文件之前,更改将不会生效。这些文件仅在首次初始化shell时使用。为了使更改生效,您需要注销并重新登录,或者打开一个新的shell并关闭旧的,或source您更改的文件。

$ vim ~/.bashrc (edit the file)
$ source ~/.bashrc (then reinitialize the shell with the file)

如果您只需要在当前shell和任何子进程中使用变量,则只需使用export即可。

答案 1 :(得分:0)

您可能也对此代码段感兴趣。无论何时修改,它都会在任何 shell中重新加载.bashrc。 (重新编辑.bashrc文件后,按(或运行命令)以重新加载新.bashrc。)

# Make sure our version of the .bashrc file is up-to-date, or reload it.
chk_bashrc_timestamp () {
    if [[ "$_BASHRC_TIMESTAMP" -lt "$(get_file_timestamp "$HOME/.bashrc")" ]]; then
        echo >&2 "Reloading .bashrc..."
        . ~/.bashrc
    fi
}
_BASHRC_TIMESTAMP=$(date +%s)

PROMPT_COMMAND=chk_bashrc_timestamp

唯一的困难是,您不得在$PATH的定义中使用PATH,否则每次需要时都会重复整个PATH

使用

SYSPATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
PATH="$HOME/bin:$SYSPATH:/opt/mystuff"

而不是

PATH="$HOME/bin:$PATH:/opt/mystuff"

我在自己的.bashrc中非常满意地使用了这个,除了我通过在PATH语句中设置每次都保护我的if重新加载。 (你可能会发现你还有其他需要保护的东西。)

if _BASHRC_WAS_RUN 2>/dev/null; then
    :;
else    # Stuff that only needs to run the first time we source .bashrc.
        # Useful to allow resourcing new changes
    export PATH="$HOME/bin:$HOME/.cabal/bin: ..."
    alias _BASHRC_WAS_RUN=true
fi