embert schrieb:
> Kannst du mir deinen Einzeiler nochmal etwas aufbröseln?
1 | time while IFS= read -r line; do ./myProgram -a foo -b "$line"; done < /pfad/zu/datei/mit/zufallsdaten
|
time misst die Zeit, die ein Prozess verbraucht hat, im oberen Beispiel
ist das der while-loop. Der while-loop in bash nutzt das nachfolgende
Kommando als Bedingung, und führt dies vor jedem Schleifendurchlauf aus.
Wenn das Programm mit einem Status beendet wird, der nicht 0 ist, wird
die Schleife abgebrochen. Das Kommando "read", welches ein shell-builtin
ist, mit dem Argument "line", liest die nächste Zeile vom Standard Input
ein, und speichert diese in der Environment Variable "line". Wenn kein
Newline gefunden wird gibt read einen Status zurück der nicht 0 ist. Das
Semikolon (;) markiert das Ende des Kommandos, und kann auch durch eine
neue Zeile ersetzt werden. "do" zeigt den Anfang des Schleifenrumpfes
an, und "done" das ende davon. Die Kommandos im Schleifenrumpfes werden
bei jedem Schleifendurchlauf ausgeführt, hier also './myProgram -a foo
-b "$line"'. Durch das '$' Zeichen vor "line" wird "line" als Variable
behandelt und dessen Wert vor dem Ausführen an der stelle eingesetzt.
Die Anfürungszeichen '"' verhindern, dass Zeichen des IFS, z.B. Abstände
im Wert der Variable "line", gesondert behandelt werden, also nicht
zusammengefasst werden, und das Argument nicht in mehrere unterteilt
werden kann. Das Kleinerals zeichen "<" öffnet die nachfolgende Datei,
hier "/pfad/zu/datei/mit/zufallsdaten" zum lesen für den Ausdruck, der
Links davon steht, hier die while-schleife. Die While schleife bekommt
deshalb einen eigenen Prozess, eine sogenannte subshell, und der
Standard Input dieser Subshell, und somit aller darin ausgeführten
gestarteten Prozesse, ist die zum lesen geöffnete Datei. Deshalb liest
diese Schleife die Datei Zeile für Zeile aus und speichert die Zeile in
"line", bevor der die Befehle im Schleifenrumpf abgearbeitet werden.