Generieren eines verschachtelten Teils eines Glob-Musters mithilfe der Befehlssubstitution

Generieren eines verschachtelten Teils eines Glob-Musters mithilfe der Befehlssubstitution

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 echohier 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|yyhier 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 zshdiese 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 cmdwith zu verbinden |und als Glob zu interpretieren. Siehe auch das bParametererweiterungsflag, wenn Sie nicht möchten, dass diese Wörter selbst als Muster behandelt werden:

echo (${~${(j:|:)${(b)$(cmd)}}}).txt

verwandte Informationen