我用zsh
。
比如说,我想从 中删除当前目录cdpath
。这意味着我需要根据内容删除一个元素,这很符合模式${name:#to_be_removed}
。但有一个问题:to_be_removed
是替换的结果(即$(pwd)/
)。我该如何优雅地实现这一点?我做到的最好的方法是:
cdpath=("${(s/ /)$(eval echo $(echo "\${(@)cdpath:#${$(pwd)}/}"))}")
这对我来说是一个常见的用例,大量这种 *SH 混乱的情况开始让我感到烦躁……
谢谢,PythonNut
答案1
如果你想从$cdpath
数组中删除当前目录,我只需使用
cdpath=(${cdpath/(#s)$PWD(#e)})
(#s)
与“普通”正则表达式中的“和”(#e)
起着相同的作用,即字符串的开始和结束。^
$
请注意:这些都需要setopt EXTENDED_GLOB
工作!
如果你需要外部命令,
cdpath=(${cdpath/(#s)${$(some_command)}})
应该管用。
测试用例:
$ setopt EXTENDED_GLOB
$ cdpath=(/foo /foo/bar /bar)
$ pwd
/bar
$ cdpath=(${cdpath/(#s)${$(builtin pwd)}})
$ print -l $cdpath
/foo
/foo/bar