GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum verliere ich anscheinend Daten, wenn ich diese Bash-Pipe-Konstruktion verwende?

Denn die nc Befehl in <(...) liest auch von stdin.

Einfacheres Beispiel:

$ nc -l 9999 >/tmp/foo &
[1] 5659

$ echo text | cat <(nc -N localhost 9999) -
[1]+  Done                    nc -l 9999 > /tmp/foo

Woher kam die text gehen? Durch die netcat.

$ cat /tmp/foo
text

Ihr Programm und nc konkurrieren um die gleiche stdin und nc bekommt etwas davon.


epoll() oder poll(), die mit E/POLLIN zurückkehren, werden Ihnen nur sagen, dass es sich um eine Single handelt read() darf nicht blockieren.

Nicht, dass Sie in der Lage sein werden, viele Ein-Byte-Lesevorgänge bis zu einem Zeilenumbruch durchzuführen, wie Sie es tun.

Ich sage kann weil ein read() nach epoll(), das mit E/POLLIN zurückgegeben wird, immer noch blockieren kann.

Ihr Code wird auch versuchen, über EOF hinaus zu lesen, und alle read()-Fehler vollständig ignorieren.


Linux
  1. Warum funktioniert dieses „beim Lesen“ in einem Terminal, aber nicht in einem Shell-Skript?

  2. Verwenden von Case-Anweisungen in Bash

  3. Beispiel für die Verwendung benannter Pipes in Linux Bash

  4. Verwenden von random zum Generieren einer zufälligen Zeichenfolge in Bash

  5. Warum wird mein $LD_LIBRARY_PATH zurückgesetzt, wenn ich screen mit bash verwende?

So verwenden Sie den Bash-Lesebefehl

So lesen Sie Dateien Zeile für Zeile in Bash

Bash las Befehl

So lesen Sie eine Datei Zeile für Zeile in Bash

So überwachen Sie den Fortschritt von Daten durch eine Pipe mit dem Befehl „pv“.

Bash-Scripting:So lesen Sie Daten aus Textdateien