2013-06-24 12 views
8

To jest tylko hipotetyczne pytanie - nie rozwiązując żadnego prawdziwego problemu - tylko uczenie się bash.Wklej wynik polecenia Tee

komendą tee jest możliwe rozdzielać produkcję na bardziej różne strumienie, takie jak:

command1 | tee >(commandA1 | commandA2 >file1) >(commandB1 | commandB2 >file2) >file0 

tak graficznie odbywa się następny

    ---commandA1---commandA2--> file1 
       /
command1---tee-------> file0 
       \ 
        ---commandB1---commandB2--> file2 

Teraz komendą paste może być np

paste file1 file2 | command3 

ale znowu mogę przekierować do wyjścia pasty z innym programami, jak:

paste <(ls) <(ls) | command3 

Pytanie brzmi: czy jest to możliwe nieco złączyć dwa strumienie w jedną, coś jak

    ---commandA1---commandA2--- 
       /       \ 
command1---tee-------> file0     --- paste---command3 
       \       /
        ---commandB1---commandB2--- 

Ps: średnia bez plików pośrednich ...

+5

Nie bez pośredniego lub pliku o nazwie rury. Zobacz 'mkfifo' – SheetJS

+3

To jest rodzaj pytań, które uwielbiam oglądać - w pewnym sensie to, co nie jest trywialne. Niestety, nie wiem wystarczająco głęboko bash, aby pokazać, jak to osiągnąć za pomocą "nazwanych potoków", ponieważ @Nirk zasugerował ... +1 – kobame

Odpowiedz

3

Oto jak to zrobić z nazwiskiem p IPES:

trap "rm -f /tmp/file1 /tmp/file2; exit 1" 0 1 2 3 13 15 
mkfifo /tmp/file1 
mkfifo /tmp/file2 
command1 | tee >(commandA1 | commandA2 >/tmp/file1) >(commandB1 | commandB2 >/tmp/file2) >file0 
paste /tmp/file1 /tmp/file2 | command3 
rm -f /tmp/file1 /tmp/file2 
trap 0 

przykład roboczych:

$ cd -- "$(mktemp -d)" 
$ trap "rm -f pipe1 pipe2; exit 1" 0 1 2 3 13 15 
$ mkfifo pipe1 pipe2 
$ printf '%s\n' 'line 1' 'line 2' 'line 3' 'line 4' | tee \ 
>(sed 's/line /l/' | head -n 2 > pipe1) \ 
>(sed 's/line /Line #/' | tail -n 2 > pipe2) \ 
> original.txt 
$ paste pipe1 pipe2 | sed 's/\t/ --- /' 
l1 --- Line #3 
l2 --- Line #4 
$ rm pipe1 pipe2 
$ trap 0 
+0

Nie napisałem tego, @ JonathanLeffler dodał (przed dodaniem działającego przykładu) . – Barmar

+0

@ l0b0: 'exit 1' w pułapce, aby wskazać, że proces się nie powiódł; "exit 0" spowodowałoby mylące wrażenie, że proces się powiódł. I nie dodanie "wyjścia" oznaczałoby "wyjście ze statusem ostatniego polecenia, którym byłby" rm -f ", który by się powiódł, więc status wyjścia będzie wynosił 0." Pułapka "upewnia się, że tymczasowe FIFO są usuwane, gdy powłoka jest w stanie je usunąć. Jeśli zabijesz proces za pomocą 'kill -9', nie możesz nic zrobić, by posprzątać. Ale jeśli użyjesz HUP, INT, QUIT, PIPE lub TERM (1, 2, 3, 13, 15), powłoka oczyści się za sobą przed wyjściem. –

+0

@ JonathanLeffler Mylące jest to, że dodajesz '0' na liście sygnałów, które przechwytujesz, co oznacza, że ​​będzie działać podczas normalnego wyjścia i przekształci go w awarię wyjścia. Ale tak się nie stanie, ponieważ wyłączasz pułapkę przy wyjściu z 'pułapką 0' na końcu, więc nie ma sensu w oryginalnym poleceniu pułapki. – Barmar

Powiązane problemy