1 votes

Substitution imbriquée dans ZSH

Yo uso zsh .

Disons, par exemple, que je veux supprimer le répertoire actuel de cdpath . Cela signifie que je dois supprimer un élément sur la base de son contenu, ce qui correspond à l'objectif de l'opération. ${name:#to_be_removed} le motif est agréable. Mais il y a un hic : to_be_removed est le résultat de la substitution (à savoir $(pwd)/ ). Comment puis-je le faire de manière élégante ? Voici ce que j'ai réussi à faire de mieux :

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

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

Merci, PythonNut

1voto

mpy Points 24817

Si vous voulez supprimer le répertoire courant de l'application $cdpath j'utiliserais simplement

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

(#s) y (#e) servent le même objectif que ^ y $ dans les expressions régulières ,,normales'', c'est-à-dire le début et la fin de la chaîne. Veuillez noter : Ceux-ci devront setopt EXTENDED_GLOB au travail !

Si vous avez besoin d'une commande externe,

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

devrait fonctionner.

Cas de test :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X