Ich habe einen Vorverarbeitungsbefehl zum Ausgeben einer Datei
./preprocess.sh > preprocessed_file
und das preprocessed_file
wird so verwendet
while read line
do
./research.sh $line &
done < preprocessed_file
rm -f preprocessed_file
Gibt es eine Möglichkeit, die Ausgabe an das while read line
Teil zu leiten, anstatt sie an die vorverarbeitete Datei auszugeben ? Ich denke, es sollte einen besseren Weg geben, als diese Temperatur zu verwenden preprocessed_file
.
shell
io-redirection
Marcus Thornton
quelle
quelle
<
ist eine Umleitung, während<(...)
die Prozesssubstitutionssyntax ist. Weitere Informationen finden Sie unter: gnu.org/software/bash/manual/html_node/… .<(...)
ist ein Teil der Syntax.read
muss jeweils ein Byte gelesen werden, während es beim Lesen größerer Blöcke die Dinge optimieren und beim Lesen aus einer regulären Datei rückwärts suchen kann. Am besten vermeiden Siewhile read
Schleifen, wenn möglich. Beachten Sie auch, dass SieIFS= read -r line
die Zeile einlesen müssen$line
. Und hier$line
nicht in Anführungszeichen zu setzen (Aufruf des Operators split + glob) macht wahrscheinlich keinen Sinn.read
eingebaute Shell beim Lesen aus einer Pipe jeweils ein Zeichen liest (unabhängig davon, was sich am anderen Ende der Pipe befindet und wasread
nicht bekannt ist). Dies ist einer der Gründe, warumwhile read
Schleifen enorm langsam sind.Ja! Sie können eine Prozessleitung verwenden
|
.Eine Prozessleitung übergibt die Standardausgabe (
stdout
) eines Prozesses an die Standardeingabe (stdin
) des nächsten.Sie können optional ein Zeilenumbruchzeichen nach a einfügen
|
und den Befehl auf die nächste Zeile erweitern.Hinweis:
a|b
Entsprichtb < <(a)
, jedoch ohne die magischen Dateien, und in einer besser lesbaren Reihenfolge, insbesondere wenn die Pipeline länger wird.a|b|c
ist äquivalent zuc < <(b < <(a))
und
a|b|c|d|e
iste < < (d < <(c < <(b < <(a))))
quelle
$line
in doppelte Anführungszeichen zu setzen (z. B. in Ihrem Skript./research.sh "$line" &
).research.sh
mit dem Befehlszeilenargumentarray gearbeitet$line
wird und z. B. "eins zwei" ist, mit der Absicht, dass das erste Argument "eins" und das zweite Argument "zwei" ist,$line
wird das Zitieren dies unmöglich machen - stattdessen wird das erste Argument sein "eins zwei" und es wird keinen zweiten geben ...a|b
ist gleichbedeutend mitb < <(a)
" - nah, aber nicht ganz. In der Pipe-Version werden beide Seiten der Pipe in Subshells ausgeführt, während in der Prozessersetzungsversion nur der ersetzte Prozess in einer Subshell ausgeführt wird, jedocha
im Bereich der aktuell ausgeführten Shell-Ebene. Dies hat wichtige Auswirkungen auf den Umfang der Variablen, die ina