Substitution imbriquée dans ZSH

1

j'utilise zsh.

Dites, par exemple, que je veux supprimer le répertoire actuel de cdpath. Cela signifie que je dois supprimer un élément basé sur le contenu, qui correspond à la ${name:#to_be_removed} motif bien. Mais il y a un problème: to_be_removed est le résultat de la substitution (à savoir, $(pwd)/ ). Comment pourrais-je retirer ceci d'une manière élégante? Le meilleur que j'ai réussi est celui-ci:

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

C'est un cas d'utilisation courant pour moi, et avoir des tonnes de ce * désordre SH commence à m'énerver ...

Merci, PythonNut

PythonNut
la source
Si vous en avez assez de taper ce "cas d'utilisation courant", pourquoi ne définissez-vous pas une fonction pour cela?
mpy

Réponses:

1

Si vous souhaitez supprimer le répertoire en cours de la $cdpath tableau, je voudrais simplement utiliser

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

(#s) et (#e) servir le même but que ^ et $ dans les expressions rationnelles '' normales, c’est-à-dire le début et la fin de la chaîne. Notez s'il vous plaît : Ceux-ci auront besoin setopt EXTENDED_GLOB travailler!

Si vous avez besoin d'une commande externe,

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

devrait marcher.

Cas de test:

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