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

Mehrere Standardeingaben? Wie?

Dies ist keine mehrfache Standardeingabe. Dies ist ein Bashismus, der 'Process Substitution'http://tldp.org/LDP/abs/html/process-sub.html

genannt wird

Es erstellt eine Pseudodatei (/dev/fd/something ) für jede Substitution. Es ist ziemlich nützlich. Der Befehl kann nur als Stream lesen, dh er kann nicht mit fseek hin und her gehen. Es muss es als Strom von Bytes lesen, wie eine Pipe.

BONUS-Antwort

Sie müssen nicht zu viel tun, um dies zu verwenden. Was Ihr Skript betrifft, erhält es einen gültigen Dateinamen auf der Befehlszeile, der wie alles andere geöffnet werden kann. Wie andere gesagt haben, würden Sie diff /dev/fd/XX /dev/fd/YY sehen . Wenn Sie eine stat() für eine dieser Pseudodateien ausführen, werden Sie sehen, dass es sich um eine benannte Pipe handelt, und Sie sollten sie mit Pipe-Semantik behandeln - nämlich ohne fseek() oder ftell(). Wenn Sie einen stat()-Test durchführen, um explizit zu sehen, ob es sich um eine Datei handelt (z. B. [ -f $1 ] ) dies wird break - dies ist immerhin als benannte Pipe implementiert.


<(...) verarbeitet die Ersetzung in bash. Die Ausgabe des Prozesses in den Klammern wird an einen zusätzlichen Dateideskriptor über die normalen 3 hinaus gesendet, und ein Dateiname wird zurückgegeben, der diesem Dateideskriptor entspricht. Auf diese Weise kann die Ausgabe eines Befehls als Dateiname behandelt werden, der an einen anderen Befehl übergeben wird.


Es gibt eine stdin und ein stdout für jeden Prozess . Sie sind normalerweise mit dem Terminal verbunden, können aber getrennt voneinander umgeleitet werden.

Im Beispiel gibt es zwei wget beteiligten Prozesse, von denen jeder seinen eigenen stdin erhält und stdout . Jeweils wget Der Prozess schreibt in - , das ist sein stdout . Dann bash 's Prozesssubstitution <(...) verbindet die stdout des Prozesses in eine eindeutige Pseudodatei, aus der diff kann lesen. Beachten Sie, dass die zwei Prozesssubstitutionen zwei verschiedene Pseudodateien ergeben! Also diff sieht so etwas wie:

diff /dev/fd/XX /dev/fd/YY

wo der stdout von wget -q -O - URL1 ist mit /dev/fd/XX verbunden , und der stdout von wget -q -O - URL2 bis /dev/fd/YY .


Linux
  1. So installieren Sie vtop unter Linux

  2. So komprimieren Sie mehrere Dateien unter Linux

  3. Wie sende ich Stdout an mehrere Befehle?

  4. Dd:Mehrere Eingabedateien?

  5. So führen Sie den Rsync-Prozess im Hintergrund aus

Emoji unter Linux eingeben

So beenden Sie einen Prozess in Linux

Wie man einen Prozess unter Linux beendet

So verbinden Sie mehrere PDF-Seiten zu einer einzigen Seite

Wie behandelt Copy-on-Write in fork() mehrere Forks?

Wie wird die Prozesspriorität berechnet?