Czy dane wyjściowe jednego polecenia można powiązać z dwoma innymi poleceniami?

27

Jak mogę potokować wyjście jednego polecenia do wejścia dwóch innych poleceń jednocześnie?

Richard Hoskins
źródło
4
Tak. Zobacz to pytanie stackoverflow: stackoverflow.com/questions/670784/...
Blair Conrad

Odpowiedzi:

56

Wygląda na to, że teepolecenie zrobi to, co chcesz.

Kluczem jest użycie

>( )

do podstawienia procesu . Przy teeużyciu następującego wzoru:

tee >(proc1) >(proc2) >(proc3) | proc4

Więc jeśli chcesz użyć danych wyjściowych lsjako danych wejściowych do dwóch różnych grepprogramów, zapisz dane wyjściowe każdego z nich grepdo różnych plików i prześlij wszystkie wyniki less, spróbuj:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

Wyniki ls -Abędą „przesyłane” do obu greps. Plik hidden-filesbędzie miał zawartość z wyjścia pierwszego grepi normal-filesbędzie miał wyniki drugiego grep. Wszystkie pliki zostaną wyświetlone na stronie less. EDIT : co widać lessto dokładnie taki sam wyjściowy z ls -A, a nie wynikiem greps. Jeśli chcesz zmodyfikować dane wyjściowe z ls -Ana less(np. Zamieniając kolejność, aby normalne pliki były wyświetlane przed plikami ukrytymi), spróbuj tego:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

Bez >/dev/nulltego wyjście greps byłoby dołączone do wyjścia ls -Azamiast go zastępować.

źródło

Ben
źródło
3
ten jest bardzo dobry!
hayalci
3
+1, ponieważ nawet po 10 latach skryptowania powłoki nigdy tego nie widziałem!
jtimberman
6

Użyj „tee”.

Przykład:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

Spowoduje to wysłanie wyniku polecenia grep zarówno do terminala, jak i do wc (którego wyjście z kolei zostanie przekierowane do pliku grepresult).

„Tee” wyjaśniono w tee ( Wikipedia) w artykule w Wikipedii . Centralne to: „Polecenie tee odczytuje standardowe dane wejściowe, a następnie zapisuje ich zawartość na standardowe dane wyjściowe i jednocześnie kopiuje je do określonych plików lub zmiennych.”.

Peter Mortensen
źródło