Wygląda na to, że nowsze wersje basha mają &>
operator, który (o ile dobrze rozumiem) przekierowuje zarówno stdout, jak i stderr do pliku ( &>>
zamiast tego dołącza do pliku, jak wyjaśnił Adrian).
Jaki jest najprostszy sposób osiągnięcia tego samego, ale zamiast tego przekierowanie do innego polecenia?
Na przykład w tej linii:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Chciałbym, aby grep dopasował zawartość zarówno na stdout, jak i stderr (efektywnie, połącz je w jeden strumień).
Uwaga : to pytanie dotyczy potoku, a nie przekierowania - więc nie jest duplikatem pytania, które jest obecnie oznaczone jako duplikat.
|&
skrótu, który moim zdaniem jest zdecydowanie najwygodniejszym rozwiązaniem do „przekierowania zarówno stdout, jak i stderr do potoku”.Odpowiedzi:
(Zauważ, że
&>>file
dołączanie do pliku&>
spowoduje przekierowanie i zastąpienie wcześniej istniejącego pliku).Aby połączyć
stdout
istderr
przekierować to drugie do pierwszego za pomocą2>&1
. To przekierowuje stderr (deskryptor pliku 2) do stdout (deskryptor pliku 1), np .:stdout
idzie na stdout,stderr
idzie na stderr.grep
tylko widzistdout
, stądstderr
drukuje do terminala.Z drugiej strony:
Po zapisaniu zarówno na stdout, jak i stderr,
2>&1
przekierowuje stderr z powrotem na stdout igrep
widzi oba ciągi na stdin, w ten sposób odfiltrowuje oba.Więcej o przekierowaniu przeczytasz tutaj .
Odnośnie twojego przykładu (POSIX):
lub używając
>=bash-4
:źródło
&>>
. Poprawiłem swoje pytanie.|&
zamiast2>&1 |
.|&
zaproponowanego przez @ AdrianFrühwirth dla przyszłych czytelników: ta funkcja jest obsługiwana tylko wbash
wersji 4+. Jeśli używasz 3 lub mniej, musisz się trzymać2>&1 |
.Bash ma skrót dla
2>&1 |
, a mianowicie|&
, który potokuje zarówno stdout, jak i stderr (zobacz podręcznik ):Zostało to wprowadzone w Bash 4.0, zobacz informacje o wydaniu .
źródło