Warum gibt `${$(pwd)}` das aktuelle Arbeitsverzeichnis in zsh aus?

Warum gibt `${$(pwd)}` das aktuelle Arbeitsverzeichnis in zsh aus?

In zsh ${$(pwd)}wird das aktuelle Verzeichnis ausgegeben. Wenn ich jedoch ausführe echo ${/path/to/somewhere}, wird nur eine leere Zeile angezeigt. Warum passiert das? Danke!

Antwort1

Ich nehme an, du sprichst von print ${$(pwd)}so etwas oder so ähnlich, oder?!

Die Erweiterung ${$(pwd)}auf das aktuelle Arbeitsverzeichnis ist das erwartete Verhalten, auch wenn es auf den ersten Blick seltsam aussehen mag. Lassen Sie sich nicht täuschen, indem Sie denken, dass die Befehlsersetzung $(pwd)zuerst ausgewertet wird und das Ergebnis alsVariablennamen... nein, es wird verwendet alsVariablenwert wie man zshexpnerklärt:

${name} Der Wert des Parameternamens (sofern vorhanden) wird ersetzt.

(...) Wenn anstelle von oben ein ${...}Typparameterausdruck oder eine $(...)Typbefehlsersetzung verwendet wird name, wird dieser zuerst erweitert und das Ergebnis wird verwendet, als wäre es der Wert von name. (...) Die Form mit $(...)ist häufig in Kombination mit den als nächstes beschriebenen Flags nützlich; siehe die Beispiele unten.

(...) Das Flag f ist nützlich, um eine in Anführungszeichen gesetzte Ersetzung zeilenweise aufzuteilen. Beispielsweise ${(f)"$(<file)"}wird der Inhalt der Datei so aufgeteilt, dass jede Zeile ein Element des resultierenden Arrays ist.

Zu Ihrem zweiten Beispiel. Ich denke, das ist die Syntax zum Ersetzen von Mustern:

${name/pattern/repl} Ersetzen Sie die längstmögliche Musterübereinstimmung in der Erweiterung des Parameternamens durch die Zeichenfolge „repl“. (...)

Sehen Sie sich zuerst dieses Beispiel an:

$ foo=hello
$ print ${foo/hello/good/bye}
good/bye

Wenn Sie es weglassen, fooführen Sie zsheine Suche und einen Ersatz in der Variablen aus ${}, die leer ist:

$ print ${}

$

-- gibt daher ${/something/foo/bar}auch eine leere Zeichenfolge zurück.

verwandte Informationen