
Beginnen wir mit einem einfachen Beispiel zur Dateinamengenerierung:
echo (xx|yy|zz)*.txt # Example 1
Hier werden alle txt-Dateien aufgelistet, die mit xx, yy oder zz beginnen. Lassen Sie uns diese Alternativen nun dynamisch mithilfe der Befehlssubstitution generieren. Ich verwende dies echo
hier nur zur Veranschaulichung meines Ziels. In einem „realen“ Beispiel wäre dies natürlich ein Programm:
echo $(echo '(xx|yy|zz)')*.txt # Example 2
Dies würde wie oben beschrieben funktionieren. Jetzt kommt der schwierige Teil: Die Befehlsersetzung sollte nur einen TEIL der Liste der Alternativen liefern:
echo ($(echo 'xx|yy')|zz)*.txt # Example 3 (does not work)
Das würde nicht mehr funktionieren: Es würde Dateien finden, die mit zz beginnen, aber nicht solche mit yy. Ich vermute, Zsh sucht nach Dateien, die buchstäblich mit xx|yy
hier beginnen.
Wir können es zum Laufen bringen, wenn wir eine Hilfsvariable verwenden:
list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt # Example 4
Nun zu meiner Frage:
Ist es möglich, den Effekt von Beispiel 4 zu erzielen, ohne eine temporäre Variable zu verwenden?
Antwort1
Benutz einfach:
echo (${~"$(echo 'xx|yy')"}|zz)*.txt
Beachten Sie die Anführungszeichen um die Befehlsersetzung, da zsh
diese eine Worttrennung durchführt, wenn nicht standardmäßig ein Globbing bei der Befehlsersetzung erfolgt. Dies kann in folgenden Fällen nützlich sein:
echo (${~${(j:|:)$(cmd)}}).txt
um die Wörter in der Ausgabe von cmd
with zu verbinden |
und als Glob zu interpretieren. Siehe auch das b
Parametererweiterungsflag, wenn Sie nicht möchten, dass diese Wörter selbst als Muster behandelt werden:
echo (${~${(j:|:)${(b)$(cmd)}}}).txt