如何使用 fish shell 从我的 PATH 环境变量中删除特定变量
How can I delete a specific variable from my PATH environment variable using fish shell
给定输入变量说 usr/bin 和以下 PATH
echo $PATH
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/sbin /Developer/bin
我如何编写(在 fish shell 中)给定 string/input 的函数可以从我的 PATH 变量中删除该路径?
->理想情况下删除第一次出现的情况(与删除所有出现的此类变量的情况相比)
我正在考虑编写一个小函数,例如
deleteFromPath usr/bin
用像 Perl/python/ruby 这样的脚本语言而不是用 fish shell 来写会更好吗?
for x in $list
if [ $x = $argv ]
//delete element x from list -> How?
end
end
我们可以拨通 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[@]}"
这在鱼身上很容易做到。
使用 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
请注意,这会比较路径 strings,因此您需要使用前导“/”调用 deleteFromPath /usr/bin
。否则找不到组件。
给定输入变量说 usr/bin 和以下 PATH
echo $PATH
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/sbin /Developer/bin
我如何编写(在 fish shell 中)给定 string/input 的函数可以从我的 PATH 变量中删除该路径? ->理想情况下删除第一次出现的情况(与删除所有出现的此类变量的情况相比)
我正在考虑编写一个小函数,例如
deleteFromPath usr/bin
用像 Perl/python/ruby 这样的脚本语言而不是用 fish shell 来写会更好吗?
for x in $list
if [ $x = $argv ]
//delete element x from list -> How?
end
end
我们可以拨通 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[@]}"
这在鱼身上很容易做到。
使用 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
请注意,这会比较路径 strings,因此您需要使用前导“/”调用 deleteFromPath /usr/bin
。否则找不到组件。