/ / zsh: substitution de commandes, citations correctes et barre oblique inverse (à nouveau) - zsh

zsh: substitution de commandes, citations correctes et barre oblique inverse (à nouveau) - zsh

(Note: Ceci est une question de remplacement pour mon post zsh: substitution de commande et citation correcte , mais maintenant avec une complication supplémentaire).

J'ai une fonction _iwpath_helper, qui produitpour stdout un chemin, qui contient éventuellement des espaces. Pour cette discussion, supposons que _iwpath_helper retourne toujours un texte constant, par exemple

function _iwpath_helper
{
echo "home/rovf/my directory with spaces"
}

J'ai aussi une fonction quote_stripped en attend uneparamètre et si ce paramètre est entouré de guillemets, il les supprime et renvoie le texte restant. Si le paramètre n'est pas entouré de guillemets, il le retourne inchangé. Voici sa définition:

function quote_stripped
{
echo ${1//[""]/}
}

Maintenant, je combine les deux fonctions de la manière suivante:

target=$(quote_stripped "${(q)$(_iwpath_helper)}")

(Bien sûr, "quote_stripped" serait inutile dans cet exemple de jouet, car _iwpath_helper ne renvoie pas ici un chemin délimité par des guillemets, mais dans l'application réelle, il le fait parfois).

Le problème est maintenant que la variable cible contient un réal caractère de barre oblique inverse, à savoir si je fais un

echo +++$target+++

je vois

+++home/rovf/my directory with spaces

et si j'essaye de

cd $target

Je reçois sur mon système le message d'erreur, que le répertoire

home/rovf/my/ directory/ with/ spaces

n'existerait pas.

(Au cas où vous vous demandez où l’avanceLes barres obliques proviennent de: Je suis exécuté sur Cygwin, et je suppose que la commande cd interprète simplement les barres obliques inverses comme des barres obliques dans ce cas, pour mieux s'adapter à l'environnement Windows).

Je suppose que les barres obliques inverses, qui apparaissent physiquement dans la variable cible sont causés par le (q) drapeau d’expansion que jeappliquer à $ (_ iwpath_helper). Mon problème est maintenant que je ne peux pas simplement supprimer le (q), car sans elle, la fonction quote_stripped obtiendrait sur le paramètre $ 1 seulement la première partie de la chaîne, jusqu'au premier espace (/ home / rovf / mon).

Comment puis-je écrire ceci correctement?

Réponses:

1 pour la réponse № 1

Je pense que vous voulez simplement éviter d'essayer de supprimer manuellement les citations et d'utiliser le (Q) drapeau d'expansion. Comparer:

% v="a b c d"
% echo "$v"
a b c d
% echo "${(q)v}"
a b c d
% echo "${(Q)${(q)v}}"
a b c d

0 pour la réponse № 2

chepner avait raison: la façon dont j'ai essayé de dissocier la corde était stupide (je pensais trop à la manière de Bourne Shell) et j'aurais dû utiliser le drapeau (Q).

Voici ma solution:

target="${(Q)$(_iwpath_helper)}"

Plus besoin de la fonction quote_stripped ....