rurociąg jest | -delimited lista poleceń. Wszelkie podane przekierowania mają zastosowanie do komend składowych (prostych lub złożonych), ale nie do potoku jako całości. Każdy łańcuch łańcuchów powoduje jedno polecenie standardowe do wejścia standardowego następnego przez niejawne zastosowanie przekierowania do każdej podpowłoki przed oszacowaniem jakichkolwiek przekierowań związanych z poleceniem.
cmd 2>&1 | less
pierwsze standardowe wyjście pierwszego podpowłoce jest przekierowany do rury, z której less
czytającego. Następnie przekierowanie 2>&1
zostanie zastosowane do pierwszego polecenia. Przekierowanie stderr na stdout działa, ponieważ stdout już wskazuje na potok. To jest przekierowanie do less
. Less's stdout i stderr prawdopodobnie zaczęły wskazywać na terminal, więc w tym przypadku nie ma to żadnego wpływu.
Jeśli chcesz przekierowanie zastosowanie do całego rurociągu, do wielu poleceń grupowych jako część rurociągu lub rurociągów gniazdo, a następnie użyć grupy poleceń (lub innego związek polecenie):
{ { cmd1 >&3; cmd2; } 2>&1 | cmd3; } 3>&2
Może być typowym przykładem. Końcowy wynik to: stderr cmd1
i cmd2
->cmd3
; cmd2
's stdout ->cmd3
; i cmd1
i cmd3
's stdout -> terminal.
Jeśli używasz bash specyficzne |&
rury, robi się obcy, ponieważ każdy z stdout rurociągu przekierowuje nadal występuje pierwszy, ale przekierowanie stderr faktycznie przychodzi ostatni. Na przykład:
f() { echo out; echo err >&2; }; f >/dev/null |& cat
Teraz, wbrew treści, wszystkie dane wyjściowe są ukryte. Pierwszy numer z f
trafia do potoku, następny stdout z f
jest przekierowywany na /dev/null
, a na końcu stderr jest przekierowywany do stdout (/dev/null
).
Polecam nigdy nie używać |&
w Bash - służy tutaj do demonstracji.
+1 dobrze wyjaśnione – jordanm
+1. Dodam tylko, że rura jest separatorem poleceń, podobnie jak średnik. –
+1 Wow, doskonała odpowiedź @ormaaj! Dokładnie tego, czego szukałem - dziękuję! –