Nie wiem, z jakiego tekstu korzysta Twoja książka, ale instrukcja bash jest jasna (jeśli znasz już przekierowania):
Jeśli |&jest używany, błąd standardowy polecenia 1, oprócz standardowego wyjścia, jest podłączony do standardowego wejścia polecenia 2 przez potok; jest skrótem od 2>&1 |. To niejawne przekierowanie standardowego błędu na standardowe wyjście jest wykonywane po wszelkich przekierowaniach określonych przez polecenie.
Więc jeśli nie chcesz mieszać standardowego wyjścia ze standardowym błędem, będziesz musiał przekierować standardowe wyjście gdzie indziej. Zobacz Jak grep standardowy strumień błędów (stderr)?
{./script.sh 2>&1>&3| sed 's:^:\t:';}3>&1
Zarówno fd 1 i 3 script.shi sedskieruje do pierwotnego przeznaczenia stdout jednak. Jeśli chcesz być dobrym obywatelem, możesz zamknąć te fd 3, których te polecenia nie potrzebują:
Podręcznik bash nie jest dla mnie całkowicie jasny. Nie bardzo rozumiem, dlaczego smth jak ./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'nie działa zgodnie z przeznaczeniem, czyli: przekierowanie script.sh„s stdout(który, zgodnie z instrukcją fragmencie powinno nastąpić wcześniej), następnie pozostawić grepdo przetwarzania skryptu stderr. Zamiast tego stderroba tdout` kończą się wstdout_goes_here
sxc731
1
@ sxc731 |&jest skrótem dla 2>&1 |. >/tmp/stdout_goes_here |&Przekierowuje więc stdout na /tmp/stdout_goes_here, a następnie 2>&1przekierowuje stderr na dokądkolwiek zmierza stdout, czyli w /tmp/stdout_goes_herekońcu |nie otrzymuje żadnych danych wejściowych, ponieważ wyjście polecenia zostało przekierowane. Należy pamiętać, że >&1przekierowuje do dowolnego miejsca, w którym deskryptor pliku 1 aktualnie się znajduje , a nie do dowolnego miejsca, w którym skończy się deskryptor pliku 1 . Aby przesłać tylko stderr i przekierować standardowe wyjście do pliku, jednym ze sposobów jest 2>&1 >/tmp/stdout_goes_here |.
Gilles „SO- przestań być zły”
6
|&potoki stderr do stdin, tak 2>&1 |, więc następny program dostanie oba na stdin.
$cat test.sh
#!/bin/bash
echo "Normal Text."
echo "Error Text.">&2
$./test.sh | sed 's:^:\t:'ErrorText.NormalText.
$ ./test.sh |& sed 's:^:\t:'NormalText.ErrorText.
./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'
nie działa zgodnie z przeznaczeniem, czyli: przekierowaniescript.sh
„sstdout
(który, zgodnie z instrukcją fragmencie powinno nastąpić wcześniej), następnie pozostawićgrep
do przetwarzania skryptustderr
. Zamiast tegostderr
oba tdout` kończą się wstdout_goes_here
|&
jest skrótem dla2>&1 |
.>/tmp/stdout_goes_here |&
Przekierowuje więc stdout na/tmp/stdout_goes_here
, a następnie2>&1
przekierowuje stderr na dokądkolwiek zmierza stdout, czyli w/tmp/stdout_goes_here
końcu|
nie otrzymuje żadnych danych wejściowych, ponieważ wyjście polecenia zostało przekierowane. Należy pamiętać, że>&1
przekierowuje do dowolnego miejsca, w którym deskryptor pliku 1 aktualnie się znajduje , a nie do dowolnego miejsca, w którym skończy się deskryptor pliku 1 . Aby przesłać tylko stderr i przekierować standardowe wyjście do pliku, jednym ze sposobów jest2>&1 >/tmp/stdout_goes_here |
.|&
potoki stderr do stdin, tak2>&1 |
, więc następny program dostanie oba na stdin.źródło
runcommand 2>&1 | tee
? tj.runcommand |& tee
?|&
w bash jest po prostu (niezbyt przenośnym) skrótem2>&1 |
, więc powinieneś zobaczyć wcięcie każdej linii.źródło