Linux / Debian - Co robi „siku” w moreutils?

Odpowiedzi:

29

Oto, co możesz zrobić z siusiu:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

Siusiu działa więc z rurami powłoki zamiast plików.

bash nie potrzebuje siusiać, może otwierać polecenia powłoki jako pliki:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)
Tobu
źródło
1
Czy działałoby to z blokadami nazw plików? Zobacz zgp.org/~dmarti/tips/git-multiple-post-receive-hooks - siusiu się służy do pomnażania stdini nadawania klonom każdego skryptu matematycznego wzorca nazwy pliku, czy czysty bash może to zrobić? AFAIU rozszerzyłoby gwiazdkę w nawiasach, powodując coś takiego, tee >(app1 app2 app3 app4)co nie jest tak, >(app1) >(app2) >(app3) >(app4)że twoja odpowiedź pokazuje
Arioch „The
@Arioch, składnia bash nie będzie działać z techniką hooks-joker. Wystarczy zainstalować moreutils.
Tobu,
1
Użyj, tee >/dev/nullaby uniknąć replikacji standardowego wejścia na standardowe wyjście
jfs
1
prawdziwą zaletą sikania nad tee jest to, że wysyła stdout z każdego podprocesu do samego stdout siku. z tee musisz przekierować każdy proces stdout do pliku, jeśli chcesz go zapisać, ale z siusiać wystarczy zapisać stdout. oczywiście ma to sens tylko wtedy, gdy każde polecenie podrzędne wyświetla podobnie sformatowaną rzecz. na przykład, jeśli nie możesz wymyślić jak lub wyrażeń regularnych w grep, możesz to zrobić cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt... używając Tee, po prostu dostaniesz kopię filena standardowe wyjście.
underrun
Ta >(command)funkcja nazywa się zastępowaniem procesów .
Vlastimil Ovčáčík
16

Prawdopodobnie łatwiej to zrozumieć, jeśli używałeś teepierwszego. To przydatne stare narzędzie pobiera standardowe dane wejściowe i zapisuje je w wielu plikach oraz standardowe dane wyjściowe. Następujące:

echo "Hello world" | tee one two

Utworzy dwa pliki o nazwach onei twooba zawierające ciąg Hello world. Będzie również drukować na twoim terminalu.


Teraz peewykonuje podobną funkcję, ale zamiast przekierowywać dane wyjściowe do wielu plików, przekierowuje do wielu dodatkowych poleceń, potoków. Różni się nieznacznie od teetego, że nie wysyła oryginalnego wejścia na standardowe wyjście, ponieważ nie ma sensu łączenie go z danymi wyjściowymi poleceń wtórnych. Poniższy bardzo prosty przykład:

echo "Hello world" | pee cat cat

Wyśle ciąg Hello worlddo terminala dwa razy. Jest tak, ponieważ każdy z dwóch przypadków catodbiera standardowe wyjście i robi to cat, co robi, czyli drukuje.

Dan Carley
źródło