12 Stimmen

Was macht <() in Bash?

In einem Beitrag Antwort auf superuser.com sehen wir, dass

join <(sort abc) <(sort bcd)

Dateien abc und bcd vor dem Senden an join sortiert werden. Dies führt zu einer Programmierfrage, die besser zu stackoverflow passt.

Wie funktioniert das? Was genau ist dieses <() Konstrukt? Wie nennt man es?

Wenn (sort abc) ein legaler Aufruf ist, der sort auf abc ausführt und einen Output zurückgibt, warum brauchen wir dann das <?

Das heißt, die folgenden zwei Zeilen sind äquivalent

(sort abc) | join - <(sort bcd)
join <(sort abc) <(sort bcd)

aber

join (sort abc) (sort bcd)

ist ein Syntaxfehler. Bitte kläre mich auf!

21voto

Juliano Punkte 35709

Dies wird als Prozesssubstitution bezeichnet.

<(list) ist ein einzelner Syntaxkonstrukt, das Zeichen '<' ist in diesem Fall kein separates Symbol. Es führt list aus und stellt dessen Ausgabe als eine Art Datei (keine Standardumleitung) für den Befehl bereit.

Es ist äquivalent dazu (außer dass es Pipes anstelle von temporären Dateien verwendet, wenn möglich):

sort abc > /tmp/1
sort bcd > /tmp/2
join /tmp/1 /tmp/2

Beachten Sie, dass die Ausgabe beider Sortierungen als Dateinamen an join übergeben werden, nicht als Standardumleitungen.

(list) ist ein anderes Konstrukt, für einen anderen Zweck. Es erstellt einfach eine Subshell, die list ausführt und ihre Standarddeskriptoren an die übergeordnete Shell übergibt.

Hier finden Sie den relevanten Teil im Bash-Handbuch.

6voto

Bombe Punkte 77831

<(Befehl) ist eine Prozess-Substitution (siehe den entsprechenden Abschnitt im man bash). Grundsätzlich wird Befehl ausgeführt und seine Ausgabe wird an eine benannte Pipe (FIFO) weitergeleitet, und das gesamte Konstrukt wird dann durch den Namen der Pipe ersetzt, was zu join /dev/fd/x /dev/fd/y führt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X