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)
bash
stronie man.Odpowiedzi:
Potoki są po prostu powiązane z innymi deskryptorami plików niż 0 (standardowe wejście):
Proces może oczywiście mieć więcej niż jeden otwarty deskryptor pliku na raz, więc nie ma problemu.
źródło
pipe()
wywołanie systemowe.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 ichdup()
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ń ...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.