1

Я использую zsh .

Скажем, например, что я хочу удалить текущий каталог из cdpath . Это означает, что мне нужно удалить элемент, основанный на контенте, который прекрасно вписывается в шаблон ${name:#to_be_removed} . Но есть одна загвоздка: to_be_removed является результатом подстановки (а именно, $(pwd)/). Как бы я справился с этим в элегантном стиле? Лучшее, что мне удалось, это:

cdpath=("${(s/ /)$(eval echo $(echo "\${(@)cdpath:#${$(pwd)}/}"))}")

Это частый случай использования для меня, и тонны этого * SH беспорядка начинают действовать мне на нервы ...

Спасибо, PythonNut

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .