2017-04-06 54 views
1

我使用fish 2.2.0。 (是的,我知道它已经老了,我无能为力。)

我想从$ PATH中取消路径(/usr/local/ferret-6.82/bin)。要做到这一点,我会假设使用sed将工作:

> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /usr/local/ferret-6.82/bin /opt/intel/bin 

> echo $PATH | sed -e 's:/usr/local/ferret-6.82/bin ::g' 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 

太棒了!然而...

> set -gx PATH (echo $PATH | sed -e 's:/usr/local/ferret-6.82/bin ::g') 
set: Warning: path component /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin may not be valid in PATH. 
set: No such file or directory 
> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /usr/local/ferret-6.82/bin /opt/intel/bin 

当然,所有这些目录都存在。手动设置路径:

> set -gx PATH /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 
> echo $PATH 
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /opt/intel/bin 

这里有什么问题?为什么我的路径设置使用sed失败?

回答

3

$ PATH,$ CDPATH和$ MANPATH是特别的鱼。 (由于2.2.0,它仅仅是那些特定变量。在此之前,这将适用于任何变量)

它们与每个组件的一个元件导出到时被转换为与从通常的冒号分隔的形式列出并从外部程序导入。

你想在这里做的是既可以使用鱼脚本:

if set -l ind (contains -i -- /usr/local/ferret-6.82/bin $PATH) 
    set -e PATH[$ind] 
end 

contains -i将返回0和输出的第一个参数是,set -e会从列表中删除该元素的索引。 “ - ”是选项分隔符,在此之后没有参数将被解释为选项。请注意缺失的引号$PATH,这会导致$ PATH的每个组件都作为单独的参数传递。

或者,因为鱼分裂命令在换行符替换,可以在每行$ PATH操作,与

printf '%s\n' $PATH | sed '\_/usr/local/ferret-6.82/bin_d' 

(注:对于“d”命令,既要躲避分隔符 - 在这种情况下的“_” - 如果不是“/”,则首先使用)

相关问题