/ / zsh Prozesssubstitution für Arrayelemente - zsh

zsh-Prozesssubstitution auf Array-Elementen - zsh

Ich versuche, ein zsh-Skript zu schreiben, das eine oder mehrere URLs als Argumente akzeptiert und einen Befehl ausführt (in diesem Fall ImageMagick) montage Befehl) für jeden von ihnen. Ziel ist es, eine Zusammenstellung von URLs erstellen zu können.

Ich kann natürlich jede der URLs herunterladen und die resultierenden Dateinamen an montage, aber die Prozesssubstitution von zsh scheint die Dinge zu vereinfachen.

Wenn ich es manuell für eine Reihe von URLs mache, ist das ziemlich einfach:

montage -size 640x480 -geometry +2+2            
=(curl -s https://i.imgur.com/fSgnUKW.jpg) 
=(curl -s https://i.imgur.com/6xIgEx2.jpg) 
output.jpg

Aber in einem Skript, in dem ich die URLs als Argumente verwenden möchte, kann ich nicht herausfinden, wie es funktioniert.

Ich weiß über die a${^foo}b Trick, um eine List Verständnis Sache zu tun, so kann ich das tun:

local -a urls
urls=(https://i.imgur.com/fSgnUKW.jpg https://i.imgur.com/6xIgEx2.jpg)
echo "=(curl -s "${^urls}")"

was produziert diese Ausgabe:

=(curl -s https://i.imgur.com/fSgnUKW.jpg) =(curl -s https://i.imgur.com/6xIgEx2.jpg)

Genau das möchte ich in der montage Kommandozeile oben, aber ich kann das nicht tun:

local -a args
args=("=(curl -s "${^urls}")")
montage -size 640x480 -geometry +2+2 $args output.jpg

Wenn ich diese Befehle mit zsh -x ausführe, sehe ich Folgendes:

+./foo:12> montage -size 640x480 -geometry +2+2 "=(curl -s https://i.imgur.com/fSgnUKW.jpg)" "=(curl -s https://i.imgur.com/6xIgEx2.jpg)" output.jpg

Mit anderen Worten, es scheint die Elemente von zu zitieren args wenn es sie erweitert. Was ich will, ist, sie einfach ohne die Anführungszeichen zu setzen und die Prozesssubstitution so zu machen, dass die =(curl -s ...) führt den Dateinamen der Ausgabe aus und gibt ihn zurück.

Ich habe festgestellt, dass dort ein "Parameter Expansion Flag" ist (Q) das besagt, dass es eine Ebene von Anführungszeichen aus dem Ergebnis entfernt, aber die letzte Zeile ändert in:

montage -size 640x480 -geometry +2+2 ${(Q)args} output.jpg

hilft nicht - ich vermute, weil es ein Array ist. Gibt es eine Möglichkeit, die Array-Elemente ohne Anführungszeichen zu erweitern und die Prozesssubstitution durchzuführen, so dass ich den temporären Dateinamen für jedes der curl Prozesse "Ausgänge?

Antworten:

1 für die Antwort № 1

Deine Variable args Am Ende ist nichts mehr als eine "Zeichenkette", wenn Sie das oben genannte bewerten möchten, müssen Sie es mit analysieren eval

eval montage -size 640x480 -geometry +2+2 $args output.jpg

man zshall : eval [ arg ... ]

Lies die Argumente als Eingabe für die Shell undFühre die resultierenden Befehle im aktuellen Shell-Prozess aus. Der Rückgabestatus ist das gleiche, als wären die Befehle direkt von der. ausgeführt worden Schale; wenn es keine Argumente gibt oder sie enthalten keine Befehle (d. h. sind eine leere Zeichenfolge oder Leerzeichen) der Rückgabestatus ist Null.

Was es wesentlich ist, ist es, verkettet die verschiedenen Argumente von eval in einer großen, durch Leerzeichen getrennten Zeichenfolge und führt diese Zeichenfolge dann durch die Shell aus.