我一直在尝试将$PATH
环境变量设置为指向我需要的不同路径,但我遇到了一些问题。
主要的是当我将PATH设置为指向我需要的服务时,我希望它在所有后续的bash shell中保持这种状态。也就是说,当我打开另一个bash shell时,它也将被设置在那里,直到我决定将其切换回来。当我将PATH切换回原始值时。我希望它保持这种状态。
我在.bashrc中添加了一个小脚本,我还尝试了一个单独的脚本来改变环境变量。但问题仍然存在:如果我打开一个新的bash shell,它会继承默认的环境变量和默认的PATH。
我正在设置这些以启用守护程序服务。我尝试打开/关闭服务本身。这不起作用,因为必须更改路径,否则shell将尝试使用这些环境路径,但是关闭它的服务将会挂起。
我尝试运行一个小的C程序包装器来做这些事情,但我遇到了同样的问题。
答案 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