如何使用fish shell从PATH环境变量中删除特定变量

时间:2016-09-28 17:39:23

标签: shell scripting fish

给定输入变量说usr / bin和以下PATH

 echo $PATH 
 /usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/sbin /Developer/bin

如何编写(在fish shell中)一个函数,给定字符串/输入可以从我的PATH变量中删除该路径? - >理想情况下删除第一次出现的事件(与删除所有出现的此类变量的事件相比)

我正在考虑编写一个小功能,例如

deleteFromPath usr/bin

用Perl / python / ruby​​等脚本语言而不是fish shell编写它会更好吗?

for x in $list
    if [ $x = $argv ]
        //delete element x from list -> How?
    end
end

2 个答案:

答案 0 :(得分:4)

在鱼类中这很容易做到。

使用set -e,您不仅可以删除整个变量,还可以删除列表中的元素,例如set -e PATH[2]以删除第二个元素(鱼类列表索引从1开始)。

使用contains -i,您可以找到元素所在的索引。

因此,您需要致电set -e PATH[(contains -i $argv $PATH)]

修复了一些错误处理和边框,看起来像

 function deleteFromPath
     # This only uses the first argument
     # if you want more, use a for-loop
     # Or you might want to error `if set -q argv[2]`
     # The "--" here is to protect from arguments or $PATH components that start with "-"
     set -l index (contains -i -- $argv[1] $PATH)
     # If the contains call fails, it returns nothing, so $index will have no elements
     # (all variables in fish are lists)
     if set -q index[1]
         set -e PATH[$index]
     else
         return 1
     end
  end

请注意,这会比较路径字符串,因此您需要使用前导“/”来调用deleteFromPath /usr/bin。否则它将找不到该组件。

答案 1 :(得分:-1)

我们可以打电话给bash。 :)

function removePathElements
    set PATH (bash -c 'IFS=: read -r -a path_entries <<<"$PATH"; for idx in "${!path_entries[@]}"; do for arg; do [[ ${path_entries[$idx]} = "$arg" ]] && unset path_entries[$idx]; done; done; printf "%s\n" "${path_entries[@]}"' _ $argv)
end

要清楚,这里的嵌入式bash代码是:

IFS=: read -r -a path_entries <<<"$PATH"
for idx in "${!path_entries[@]}"; do
  for arg; do
    [[ ${path_entries[$idx]} = "$arg" ]] && unset path_entries[$idx]
  done
done
printf "%s\n" "${path_entries[@]}"