2009-08-19 23 views
11

W a post's odpowiedź na superuser.com widzimy, żeCo robi <() w Bash?

join <(sort abc) <(sort bcd) 

będzie sortować pliki ABC i BCD przed wysłaniem ich do przyłączenia się. Prowadzi to do pytania programistycznego, lepiej dostosowanego do stackoverflow.

Jak to działa? Czym dokładnie jest ta konstrukcja <()? Jak to się nazywa?

Jeśli (sortuj abc) jest połączeniem legalnym, które działa sortowanie na abc i zwraca wynik, dlaczego potrzebujemy <?

Oznacza to, że następujące dwie linie są równoważne

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

ale

join (sort abc) (sort bcd) 

jest błąd składni. Proszę, daj mi znać!

+1

Co stało się z dobrą starą tradycją czytania podręcznika dla muszli? – Jens

Odpowiedz

21

Nazywa się to podstawieniem procesu.

<(list) jest pojedynczy konstrukt składnia, postać „<” nie jest oddzielnym symbolu w tym przypadku. Wykonuje listę i dostarcza jej dane wyjściowe jako rodzaj pliku (nie standardowe przekierowanie) do polecenia.

Jest on równoważny z systemem (z wyjątkiem używa rur zamiast plików tymczasowych, jeśli to możliwe):

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

Należy pamiętać, że wyjście z obu rodzajów są jako nazwy plików dołączyć, a nie standardowych przekierowań.

(list) jest inna konstrukcja, w innym celu. Po prostu tworzy podpowłokę, która wykonuje listę, dostarczając swoje standardowe deskryptory do powłoki nadrzędnej.

Here jest odpowiednią częścią instrukcji bash.

5

<(command) jest podstawieniem Sposób (patrz według sekcję man bash). Zasadniczo polecenie jest uruchamiany, a jego wyjście jest podawana do wymienionego rury (FIFO), a cała konstrukcja jest następnie zastąpiona nazwą rury, powodując w join /dev/fd/x /dev/fd/y.