Dwie rury do jednego polecenia


9

Jestem trochę zdezorientowany następującą składnią. Chociaż działa, nie rozumie, dlaczego działa. Wygląda na to, że do polecenia diff dołączone są dwie rury. Ale czy nie jest tylko jeden STDIN?

Przykłady:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

Oto link do odpowiedniego tematu - podstawianie procesów - na bashstronie man.
chepner

Odpowiedzi:


13

Potoki są po prostu powiązane z innymi deskryptorami plików niż 0 (standardowe wejście):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

Proces może oczywiście mieć więcej niż jeden otwarty deskryptor pliku na raz, więc nie ma problemu.


Gdybym tylko znał jego zwane tymczasowymi rurami, byłbym w stanie google google. Dziękuję Ci!

@iblue: Nie sądzę, że nazywa się to „tymczasowymi rurami”. To tylko potoki utworzone przez pipe()wywołanie systemowe.
Sven Marnach,

Mówiąc dokładniej, można go nazwać „anonimowymi nazwanymi potokami”, ale wystarczy google google.

2
@WilliamPursell: Pliki nie są zaangażowane. Powłoka tworzy anonimową potok przy użyciu, pipe()a następnie wyświetla podprocesy. Główny proces ma otwarte dodatkowe deskryptory plików, jeśli używany jest anonimowy potok. Te dodatkowe deskryptory plików są przekazywane w formie /dev/fd/..., a proces zwykle po prostu je otwiera przy użyciu tych nazw plików. Doprowadzi to do ich dup()edycji, tworząc jeszcze bardziej otwarte deskryptory plików. Proces może również od razu użyć nazwanego deskryptora pliku bez żadnych otwartych wywołań ...
Sven Marnach

1
... jak pokazano w tym małym i głupim programie testowym . Po skompilowaniu do a, nazwałem go jako ./a <(ls), i pomyślnie wydrukowałem listę plików, udowadniając, że nazwany dekryptor plików (w moim przypadku 63) był już otwarty. Bash może używać nazwanych potoków w katalogu tymczasowym na innej architekturze niż Linux, w którym to przypadku żadne dodatkowe deskryptory plików nie byłyby otwarte po wejściu do głównego procesu.
Sven Marnach
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.