[ 求助 ] 环境变量的设置问题

修改.bashrc 文件,把 /sbin 加入到环境变量中
export PATH=$PATH:/sbin, 保存退出
source .bashrc
重启之后我发现 /sbin 有两个,如果这个时候我再次编辑.bashrc 文件,但是不做改动。source .bashrc,重启之后 /sbin 就出现了三个

这种重复如何解决?请教大家

比较笨的就是重新定义 path,如果不会就先:echo $PATH 贴下结果

你说的完全没看出问题,这就是预期行为,source 就是干这个的。

.bashrc 是 bash 的配置文件,你开着终端它已经加载了,所以你有了第一个 sbin。source 一次 .bashrc,你有了第二个,再 source 一次,你有了第三个。

解决办法是执行

reset

楼主我给你详细讲解下两个概念
1. source。这个命令是用来在当前 shell 执行一个 shell 脚本的。和普通的 sh /path/to/script.sh 或者 /path/to/script.sh 的不同在于,source 是在当前 shell 中运行脚本的,而后者是在新启动的 shell 进程中运行的,运行结束后,该 shell 进程就结束了,export 是不会影响当前进程的。
2. export PATH=$PATH:/sbin。这个是在当前的 PATH 变量之后追加 /sbin,然后重新导出环境变量。你再次 source 的时候,PATH 变量已经变成前次 source 之后的结果了,所以重复 source 自然就重复追加了。

如何解决你提出的问题?
首先,楼主这其实不是个问题。.bashrc 的设计意图是用在系统启动的过程执行的,正常来说只会执行一次。而来,在 PATH 路径中存在重复路径,其实并不会影响查找命令的正确性。对 PATH 的解析是从前往后的。可能有那么一点影响出现其它问题时的分析定位。
如果非要解决该问题,你可以在每次 export 之前,判断要添加的目录是否已经在 PATH 路径中。

非常感谢。但我还是有些不明白,比如原有的 PATH=/usr/bin, 然后我在.bashrc 中加入 export PATH=$PATH:/sbin,这时我执行 source .bashrc 之后 echo $PATH 显示的是 /usr/bin:/sbin,这个我已经理解了。但为什么我重新启动之后 echo $PATH 显示的是 /usr/bin:/sbin:/sbin,那是不是等于说重启时 export PATH=$PATH:/sbin 命令被执行了两次?

谢谢!
但问题是为什么我更改了.bashrc 文件,重启之后添加的那部分路径就重复了

很简单。你现在改的 .bashrc 要重启才能生效。

于是你 source 它强制让它生效,于是还没重启呢你的 $PATH 已经变成了 /usr/bin:/sbin,这时你重启,export 那个命令是在 $PATH 后面加 :/sbin,但你的 $PATH 在重启前就有了 sbin 了。所以会多一个。解决办法是运行 export 前判断 $PATH 里有没有 sbin,有就不加了。

Sent from my Galaxy Note 2 using Tapatalk 2

不是的,我修改.bashrc 文件后,不执行 source 命令,直接重启。重启后的环境变量也是重复的。
1,我先把环境变量进行更改,然后重启以保证当前的环境变量是 /user/bin
2,修改.bashrc 文件,加入 export PATH=$PATH:/sbin, 保存退出
3,直接重启,重启后发现环境变量还是变成了 usr/bin:/sbin:/sbin

这还真说明了.bashrc被调用了两次。你可以尝试提个故障。下面有类似的反馈。
forums.opensuse.org/english/get-technical-help-here/pre-release-beta/386118-bashrc-sourced-twice.html
lists.opensuse.org/opensuse/2002-02/msg00634.html
forums.opensuse.org/english/other-forums/development/programming-scripting/458127-java_home-environment-variable-showing-twice.html
lists.opensuse.org/opensuse-bugs/2007-03/msg02795.html
其实我也观察到这个现象,只是我把它忽略了…
要不楼主就按照我下面的代码进行export吧。

sbin_exist="false"
for THIS_PATH in `echo $PATH | sed 's/:/ /g'`
do
    if  $THIS_PATH == "/sbin" ];then
        sbin_exist="true"
        break
    fi
done

if  "$sbin_exist" == "false" ];then
    export PATH=$PATH:/sbin
fi

刚进入到linux,好多理念都不是很清楚,我先了解一下如何提交故障。您写的这些shell命令我拷贝下来,学习之后尝试一下。十分感谢

这不是故障。/sbin 本来就已经在 openSUSE 的 $PATH 里了。你再加肯定要多一个。