如何删除MacOS中的冗余环境变量?

时间:2014-06-22 07:54:07

标签: bash rvm environment-variables

我有我的路径

~/desktop/Ruby » echo $PATH

和结果

  

/Users/zhang/.rvm/gems/ruby-2.1.2/bin:/Users/zhang/.rvm/gems/ruby-2.1.2@global/bin:/Users/zhang/.rvm/rubies /ruby-2.1.2/bin:/usr/local/bin:/usr/local/bin:/Users/zhang/.rvm/gems/ruby-2.1.2/bin:/Users/zhang/.rvm/gems /ruby-2.1.2@global/bin:/Users/zhang/.rvm/rubies/ruby-2.1.2/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin :/ usr / sbin目录:/ sbin目录:在/ usr / local / bin目录中:/ opt / X11 / bin中:/Applications/Server.app/Contents/ServerRoot/usr/bin:/Applications/Server.app/Contents/ServerRoot/usr /sbin:/usr/local/git/bin:/usr/local/MacGPG2/bin:/Users/zhang/.rvm/bin:/Users/zhang/.rvm/bin:/Users/zhang/.rvm/bin

这里我在路径上有很多裁员,也许我在我的bash中有类似“PATH = $ PATH:.....”的东西,但我没有找到它......

所以
   1.如何删除macOS中的冗余环境变量?
   2.当我添加路径时,如何在没有重复的情况下确保环境可用?
   3.如何才能使冗余路径出现一次?

2 个答案:

答案 0 :(得分:0)

如何消除现有的重复项?

使用一些标准的Unix工具(我希望大多数工具可以在OS X上使用),你可以消除这样的重复。请注意,其中一些工具在OS X上的工作方式可能略有不同,但这些命令应该可以进行微调。我只在Linux上测试过,因为我目前无法访问OS X

PATH=`echo $PATH | sed 's/:/\n/g' | sort | uniq | paste -s --delimiters=":"`

如果您在PATH的不同部分拥有同一二进制文件的多个版本,那么排序PATH会产生令人遗憾的副作用。

为了避免这种副作用,我们可以从this answer借用一个技巧来做uniq而无需排序。

PATH=`echo $PATH | sed 's/:/\n/g' | awk ' !x[$0]++' | paste -s --delimiters=":"`

如何避免向PATH变量添加冗余路径?

使用many answers之一String contains in bash检查PATH是否已包含您要添加的路径。

if [[ $PATH != *newpath* ]]
then
   export PATH=$PATH:newpath
fi

答案 1 :(得分:0)

我自己的$HOME/.profile文件的最后一行:

eval $(perl -e 'printf qq{export %s="%s";}, $_, join(":", grep { -d $_ && !$seen{ $_ }++ } split /:/, $ENV{$_}), $_ for( qw(PATH MANPATH) );')

有:

  • 清除环境变量PATH和MANPATH
    • 删除重复项
    • 删除不存在的目录
  • 创建新的export PATH="... cleaned up path ..."
  • 重新初始化新的PATH a MANPATH

进行测试:将eval替换为echo以显示正在进行的操作