/ / zsh: Befehlssubstitution, richtige Quotierung und umgekehrter Schrägstrich (wieder) - zsh

zsh: Befehlssubstitution, richtiges Angeben und umgekehrter Schrägstrich (wieder) - zsh

(Hinweis: Dies ist eine Nachfolgefrage zu meinem Beitrag zsh: Befehlssubstitution und richtige Quotierung , aber jetzt mit einer zusätzlichen Komplikation).

Ich habe eine Funktion _iwpath_helper, die ausgibtEinen Pfad angeben, der möglicherweise Leerzeichen enthält. Für diese Diskussion nehmen wir an, dass _iwpath_helper zum Beispiel immer einen konstanten Text zurückgibt

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

Ich habe auch eine Funktion quote_stripped erwartet einenParameter und wenn dieser Parameter von Anführungszeichen umgeben ist, entfernt er sie und gibt den restlichen Text zurück. Wenn der Parameter nicht in Anführungszeichen eingeschlossen ist, wird er unverändert zurückgegeben. Hier ist seine Definition:

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

Jetzt kombiniere ich beide Funktionen auf folgende Weise:

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

(Natürlich wäre "quote_striped" in diesem Spielzeugbeispiel unnötig, da _iwpath_helper hier keinen durch Zitat begrenzten Pfad zurückgibt, aber in der realen Anwendung tut es dies manchmal).

Das Problem besteht nun darin, dass das variable Ziel a enthält echt Backslash-Zeichen, d.h. wenn ich a

echo +++$target+++

Aha

+++home/rovf/my directory with spaces

und wenn ich es versuche

cd $target

Ich bekomme auf meinem System die Fehlermeldung, dass das Verzeichnis

home/rovf/my/ directory/ with/ spaces

würde nicht existieren.

(Für den Fall, dass Sie sich fragen, wo der ForwardSchrägstriche kommen von: Ich laufe auf Cygwin und ich denke, dass der Befehl cd Backslashes in diesem Fall als Schrägstriche interpretiert, um besser für die Windows-Umgebung zu passen.

Ich schätze die Backslashes, die physikalisch in der Variable erscheinen Ziel werden durch das (q) Erweiterungsflag verursacht, das Igilt für $ (_ iwpath_helper). Mein Problem ist jetzt, dass ich das (q) einfach nicht fallen lassen kann, denn ohne es würde die Funktion quote_stripped auf Parameter $ 1 nur den ersten Teil der Zeichenkette bekommen, bis zum ersten Leerzeichen (/ home / rovf / mein).

Wie kann ich das richtig schreiben?

Antworten:

1 für die Antwort № 1

Ich denke, Sie wollen nur vermeiden, Zitate manuell zu strippen, und verwenden Sie die (Q) Erweiterungsflag Vergleichen:

% 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 für die Antwort № 2

Chepner hatte recht: Die Art, wie ich die Saite abheben wollte, war albern (ich dachte zu viel nach einem "Bourne-Shell-Weg"), und ich hätte die (Q) -Flagge benutzen sollen.

Hier ist meine Lösung:

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

Keine Notwendigkeit für die quote_stripped Funktion mehr ....