Zagnieżdżone podstawienie w ZSH

1

używam zsh.

Powiedz na przykład, że chcę usunąć bieżący katalog z cdpath. Oznacza to, że muszę usunąć element oparty na treści, który pasuje do ${name:#to_be_removed} wzór ładnie. Ale jest haczyk: to_be_removed jest wynikiem zastąpienia (mianowicie, $(pwd)/ ). Jak mógłbym to zrobić w elegancki sposób? Najlepsze, jakie udało mi się osiągnąć, to:

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

Jest to dla mnie powszechny przypadek użycia, a posiadanie ton tego * bałaganu SH zaczyna działać mi na nerwy ...

Dzięki, PythonNut

PythonNut
źródło
Jeśli jesteś zmęczony wpisywaniem tego „zwykłego przypadku użycia”, dlaczego nie zdefiniujesz do tego funkcji?
mpy

Odpowiedzi:

1

Jeśli chcesz usunąć bieżący katalog z $cdpath tablica, użyłbym po prostu

cdpath=(${cdpath/(#s)$PWD(#e)})

(#s) i (#e) służyć temu samemu celowi ^ i $ w ,, normalnych '' wyrażeniach regularnych, tj. początku i końcu ciągu. Proszę zanotować : Będą tego potrzebować setopt EXTENDED_GLOB pracować!

Jeśli potrzebujesz polecenia zewnętrznego,

cdpath=(${cdpath/(#s)${$(some_command)}})

powinno działać.

Przypadek testowy:

$ setopt EXTENDED_GLOB
$ cdpath=(/foo /foo/bar /bar)
$ pwd
/bar
$ cdpath=(${cdpath/(#s)${$(builtin pwd)}})
$ print -l $cdpath
/foo
/foo/bar
mpy
źródło