【问题标题】:turning on / off environment variables打开/关闭环境变量
【发布时间】:2013-12-02 19:03:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: linux bash shell environment-variables


    【解决方案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

    【讨论】:

    • 谢谢!您给了我一个想法,我有一个脚本可以根据需要更改 PATH,但仅在当前运行的 shell 中。正如您所说,我可以修改该脚本以更改当前的 shell PATH 变量,并在 .bashrc 中进行更改。这样,当我运行例如 $ ./changemypath 时,它将在我使用的当前 shell 以及我打开的所有后续 shell 中将其更改为我想要的。
    【解决方案2】:

    您可能也对这个 sn-p 感兴趣。每当它被修改时,它都会在 any 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 中非常满意地使用了它,除了我通过在if 语句中设置它来保护我的PATH 每次都不会重新加载。 (您可能会发现您还有其他需要保护的东西。)

    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
    

    【讨论】:

    • 谢谢,这很有帮助!这些环境变量给了我很多困难。
    • 没问题。我通常同时使用 很多 个 shell (>10),所以我几乎有必要走到这个极端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2012-12-15
    • 2011-05-24
    相关资源
    最近更新 更多