Befehlsausgabeumleitung mit '- << (…)'

10

Ich musste ein Shasum extrahieren. Das funktioniert, aber kann jemand erklären, warum?

sed 's/^.*= //' -< <(openssl dgst -sha256 filename)

Ich bin mit dem bekannten $( )Konstrukt, aber nicht finden kann docs für <( ), gekoppelt mit -<, die ich davon ausgehen , auf die wird Umleitung sedSTDIN.

Ich weiß, dass es einfachere Wege gibt, aber dieses Konstrukt entzieht sich mir.

GlenH
quelle

Antworten:

10

Das

<(openssl dgst -sha256 filename)

Konstrukt ist eine Prozesssubstitution . Es erstellt eine Datei (oder ein FIFO) hinter den Kulissen und gibt ihren Namen an die Befehlssequenz zurück.

< 

ist eine reguläre Dateiumleitung, bei der der Inhalt der Datei hinter den Kulissen zu stdinund umgeleitet wird

-

ist ein Platzhalter, der erkannt wird, sedum anzuzeigen, dass seine Eingabe von stammt stdin.

Da sedes perfekt in der Lage ist, aus Dateien zu lesen, -<erscheint dies in diesem Zusammenhang unnötig.

sed 's/^.*= //' <(openssl dgst -sha256 filename)

sollte genauso gut funktionieren.

Steeldriver
quelle
3
oder einfachopenssl ... | sed '...'
Meilen
8

Das <( COMMAND )Bash-Konstrukt wird als Prozesssubstitution bezeichnet .

Es wertet das COMMANDInnere aus und leitet seine Ausgabe an ein FIFO um, eine Named Pipe, der ein virtueller Dateideskriptor /dev/fdzugewiesen wird. Es verhält sich wie eine temporäre Datei, die die Ausgabe des ausgewerteten Befehls enthält.


Das <Bash-Konstrukt wird als Eingabeumleitung bezeichnet .

Es nimmt einen Dateideskriptor auf der rechten Seite und leitet seinen Inhalt an die STDIN (Standardeingabe) des Befehls auf der linken Seite weiter.


Das -ist kein Bash-Konstrukt, sondern ein Argument dafürsed , das seine Eingabedatei angibt. Der spezielle Wert -bedeutet, aus STDIN zu lesen (dies ist auch seddie Standardeinstellung, sodass es weggelassen werden kann).


sed 's/^.*= //' - < <(openssl dgst -sha256 filename)

Diese Zeile wird zuerst ausgeführt openssl dgst -sha256 filenameund speichert ihre Ausgabe in einem FIFO zwischen. Der Dateideskriptor, der diese Named Pipe darstellt, wird als Eingabedatei behandelt, die an die STDIN von umgeleitet wird sed 's/^.*= //' -. Dieser sedBefehl liest aus STDIN und entfernt jedes Zeichen vor einem "=" - Symbol, gefolgt von einem Leerzeichen.

Byte Commander
quelle