2011-01-19 17 views
11

Istnieje kilka poleceń uniksa, które są przeznaczone do działania na dwóch plikach. Zazwyczaj takie polecenia umożliwiają odczytanie zawartości jednego z "plików" ze standardowego wejścia za pomocą pojedynczego myślnika zamiast nazwy pliku.Przekierowywanie dwóch plików na standardowe wejście

Właśnie natknąłem a technique który wydaje się dopuszczać oba pliki mają być czytane ze standardowego wejścia.

comm -12 <(sort file1) <(sort file2) 

Moją pierwszą reakcją było niedowierzanie: „To nie powinno działać Standardowe wejście będzie po prostu konkatenację oba pliki .Plik nie będzie w stanie odróżnić plików lub nawet zda sobie sprawę, że nadano mu zawartość dwóch plików. "

Oczywiście ta konstrukcja działa. Przetestowałem to zarówno z comm i przy użyciu bash 3.2.51 na cygwin 1.7.7. Jestem ciekawy jak i dlaczego to działa:

  • Dlaczego to działa?
  • Czy to jest rozszerzenie Bash, czy jest to prosta funkcja powłoki Bourne'a?
  • Działa to w moim systemie, ale czy ta technika działa na innych platformach? (Innymi słowy, czy skrypty napisane tą techniką będą przenośne?)

Odpowiedz

9

bashu Korn (ksh93, tak), a Z shell całe wsparcie process substitution. Są one wyświetlane jako pliki dla narzędzia. Wypróbuj to:

$ bash -c 'echo <(echo)' 
/dev/fd/63 
$ ksh -c 'echo <(echo)' 
/dev/fd/4 
$ zsh -c 'echo <(echo)' 
/proc/self/fd/12 

Zobaczysz deskryptory plików podobne do pokazanych.

+0

To wszystko - zastąpienie procesu! Spędziłem dużo czasu szukając informacji o przekierowaniu, ale miałem po prostu złe imię. –

+0

Dziękuję. To pomogło. Potwierdzony ksh88 (w systemie AIX 7.1) nie obsługuje tego stylu podstawiania procesów. Dziękuję Ganesh za bash. –

4

Jest to standardowe rozszerzenie Bash. <(sort file1) otwiera potok z wynikiem polecenia sort file1, nadaje potoku tymczasową nazwę pliku i przekazuje tę tymczasową nazwę pliku w wierszu polecenia comm.

Można zobaczyć, jak to działa przez coraz echo powiedzieć, co jest przekazywane do programu:

echo <(sort file1) <(sort file2) 
Powiązane problemy