
Ich versuche, Piping und Umleitung besser zu verstehen. In jeder Anleitung steht, dass cmd1 cmd1 | cmd2
ausgeführt wird und stdout mit stdin von cmd2 geteilt wird. Aber das passt mir nicht so recht, also habe ich es getestet:
Es sieht also so aus, als ob beide ./test.shUndgrep laufen inparallel!
Hier ist der Quellcode:
#!/bin/bash
a=0
while :
do
((a=a+1))
echo "Line number $a"
sleep 1
done
Der Versuch mit verschiedenen Befehlen zeigt ähnliche Ergebnisse. Verläuft das Rohr parallel?
Wie funktionieren Pipe und Umleitung „unter der Haube“?
Antwort1
Ja, alle Befehle werden gleichzeitig ausgeführt. In Ihrem Fall grep
startet der gleichzeitig mit test.sh
, aber da er seine Standardeingabe liest, wird er blockiert, bis test.sh
er etwas hineinlegt, was nicht sofort passieren wird. Die beiden Prozesse takten sich gegenseitig. Wenn der zweite langsam ist, füllt der erste seinen Standardausgabepuffer und muss warten, bis der zweite etwas gelesen hat. Wenn der erste langsam ist, wird der zweite blockiert, während er Eingaben liest, wenn keine verfügbar sind.
In der Praxis wird die Standardausgabe des ersten Prozesses in ziemlich großen Blöcken (ca. 4 KB) geschrieben (*), sodass der zweite Prozess nichts zu lesen hat, bis der erste Prozess mindestens 4 KB an Daten geschrieben hat. Ihre test.sh
Verwendung echo
könnte etwas anders sein und eine zeilengepufferte Ausgabe erzeugen.
(*) Die Regel lautet, dass die Ausgabe an ein „tty“ (also ein Terminal) zeilenweise gepuffert wird: Ein LF in der Ausgabe führt zur eigentlichen Ausgabe. Andernfalls wird sie in 4K-Blöcken gepuffert. Der erste Prozess kann auch explizit die gesamte Pufferung unterdrücken, dies ist jedoch schlecht für die Leistung.
Antwort2
Sie sehen sich tatsächlich das an, was als flow control
, und/oder (Um-)Umleitung bezeichnet wird – noch einmal; flow control
, oder stdin
, stdout
(Standard-Eingang / Standard-Ausgang).
Ich hoffe, meine obige Aussage hilft Ihnen besser zu verstehen, wasbeabsichtigtauftreten, und was können Sie bessererwarten.
Rohroder "Piping" stdout
lediglichleitet stdout
in den meisten Fällen.
Parallel istWirklichein anderer Name fürTandem. Du kannstversuchen2 verschiedene/gleiche Befehle/Ausgaben gleichzeitig auszuführen. Aber die Erwartung einessynchronisiertEin Run wäre unklug, da er unwahrscheinlich ist.
Zu Ihrem Beispiel: Hier führen Sie ein sogenanntesbedingt. Ähnlich wie ein Verkehrsschild oder eine Ampel. Diesebedingt(S)Direkte fließenbasierend auf einemZustand. In Ihrem Beispielwährend"Zustand" --während Das, TunDasBedingungen im Allgemeinenumleiten stdin
, stdout
.
Als direkte Antwort auf Ihre 2 direkten Fragen
- Verläuft das Rohr parallel
Nein, nicht unbedingt. Zumindest nicht in dernormalSinn von „parallel“ (Tandem).
Aber pipe
dürfenFeuer (einleiten) 2Arbeitsplätzezur gleichen Zeit. Sogar dieDasselbeArbeitzweimal.
- Wie funktionieren Pipe und Umleitung „unter der Haube“?
Ich hoffe, ich habe es dir oben besser veranschaulicht. :)
oder
cat ./ASCII | grep somename >./output
Das Obige cat ./ASCII
istAusgabe( stdout
). Das wirdEingang( stdin
) durchRohr( |
) für grep somename
. Welches ist(um)geleitet( >
) zu seiner endgültigen Ausgabe ./output
.