Verschachtelte Ersetzung in ZSH

1

Ich benutze zsh.

Angenommen, ich möchte das aktuelle Verzeichnis entfernen cdpath. Das bedeutet, dass ich ein inhaltsbasiertes Element entfernen muss, das gut zum ${name:#to_be_removed}Muster passt . Aber es gibt einen Haken: to_be_removedist das Ergebnis der Substitution (nämlich $(pwd)/). Wie würde ich das in einer eleganten Fasion durchziehen? Das Beste, was ich geschafft habe, ist Folgendes:

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

Dies ist ein häufiger Anwendungsfall für mich, und Tonnen von diesem * SH-Chaos gehen mir langsam auf die Nerven ...

Danke, PythonNut

PythonNut
quelle
Wenn Sie es leid sind, diesen "allgemeinen Anwendungsfall" einzugeben, warum definieren Sie keine Funktion dafür?
mpy

Antworten:

1

Wenn Sie das aktuelle Verzeichnis aus dem $cdpathArray entfernen möchten , würde ich einfach verwenden

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

(#s)und (#e)dienen dem gleichen Zweck wie ^und $in "normalen" regulären Ausdrücken, dh Anfang und Ende der Zeichenkette. Bitte beachten Sie : Diese müssen setopt EXTENDED_GLOBfunktionieren!

Wenn Sie einen externen Befehl benötigen,

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

sollte arbeiten.

Testfall:

$ setopt EXTENDED_GLOB
$ cdpath=(/foo /foo/bar /bar)
$ pwd
/bar
$ cdpath=(${cdpath/(#s)${$(builtin pwd)}})
$ print -l $cdpath
/foo
/foo/bar
mpy
quelle