Fish:如果使用sed编辑$path,则从$path删除路径失败

Fish:如果使用sed编辑$path,则从$path删除路径失败,sed,path,fish,Sed,Path,Fish,我正在使用fish2.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 > ec

我正在使用
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路径设置失败?

$path、$CDPATH和$MANPATH在fish中是特殊的。(从2.2.0开始,它只是那些特定的变量。在此之前,这将适用于任何变量)

它们是每个组件都有一个元素的列表,在导出到外部程序或从外部程序导入时,这些元素转换为常用的冒号分隔形式

您要在此处执行的操作是使用fish脚本:

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的每个组件作为单独的参数传递

或者,由于fish会在换行符上拆分命令替换,所以可以在每行$PATH上操作,使用

printf '%s\n' $PATH | sed '\_/usr/local/ferret-6.82/bin_d'
(注意:对于“d”命令,如果不是“/”,则在首次使用时必须转义分隔符-“\u1”)