Согласно « Linux: The Complete Reference 6th Edition » (стр. 44), вы можете передавать только STDERR, используя |&
символы перенаправления.
Я написал довольно простой скрипт для проверки этого:
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
Я запускаю этот скрипт так:
./script.sh |& sed 's:^:\t:'
Предположительно, будут отступать только строки, напечатанные в STDERR. Однако, на самом деле, это не так, как я вижу:
Normal Text.
Error Text.
Что я здесь не так делаю?
источник
./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'
не работает должным образом , то есть: редиректscript.sh
«sstdout
(который, в соответствии с инструкцией сниппет должен произойти первый), а затем позволяютgrep
обрабатывать сценарияstderr
. Вместо этогоstderr
и tdout` оба заканчивают вstdout_goes_here
|&
это шортхард для2>&1 |
. Так>/tmp/stdout_goes_here |&
перенаправляет стандартный вывод/tmp/stdout_goes_here
, затем2>&1
перенаправляет stderr туда, куда идет stdout, то есть/tmp/stdout_goes_here
, и, наконец|
, не получает никакого ввода, потому что выходные данные команды были перенаправлены. Имейте в виду, что>&1
перенаправляет туда, куда в настоящее время направляется дескриптор файла 1 , а не туда, куда в конечном итоге придет дескриптор файла 1 . Для передачи только stderr и перенаправления stdout в файл одним из способов является2>&1 >/tmp/stdout_goes_here |
.|&
каналы stderr к stdin, вроде бы2>&1 |
, поэтому следующая программа получит оба на stdin.источник
runcommand 2>&1 | tee
? то естьruncommand |& tee
?|&
в bash это просто (не очень переносимый) ярлык2>&1 |
, поэтому вы должны видеть каждую строку с отступом.источник