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 zshexpn
erklärt:
${name}
Der Wert des Parameternamens (sofern vorhanden) wird ersetzt.(...) Wenn anstelle von oben ein
${...}
Typparameterausdruck oder eine$(...)
Typbefehlsersetzung verwendet wirdname
, wird dieser zuerst erweitert und das Ergebnis wird verwendet, als wäre es der Wert vonname
. (...) 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, foo
führen Sie zsh
eine Suche und einen Ersatz in der Variablen aus ${}
, die leer ist:
$ print ${}
$
-- gibt daher ${/something/foo/bar}
auch eine leere Zeichenfolge zurück.