Как передать стандартный поток ошибок, не передавая стандартный выходной поток?
Я знаю, что эта команда работает, но она также записывает стандарт.
Command 2>&1 | tee -a $LOG
Как мне получить только стандартную ошибку?
Примечание. Я хочу просто записать поток stderr в журнал и записать как stderr, так и stdout в консоль.
Для этого используйте один дополнительный дескриптор файла для переключения stderr и stdout:
find /var/log 3>&1 1>&2 2>&3 | tee foo.file
В принципе, это работает, или, по крайней мере, я думаю, что это работает следующим образом:
Изменение направления оценивается слева направо.
3>&1
Делает новый файловый дескриптор 3 дубликатом (копией) fd 1 (stdout).
1>&2
Сделайте stdout (1) дубликатом fd 2 (stderr)
2>&3
Сделайте fd 2, дубликат (копию) 3, который ранее был копией stdout.
Итак, теперь stderr и stdout поменялись местами.
| tee foo.file
tee дублирует файловый дескриптор 1, который был преобразован в stderr.
Команда Кайла для Unix / Linux выполняет работу по переключению STDERR на STDOUT; однако объяснение не совсем верное. Операторы перенаправления не копируют или дублируют, они просто перенаправляют поток в другое направление.
Переписав команду Кайла, временно переместив 3> & 1 в конец, можно было бы легче понять концепцию:
find /var/log 1>&2 2>&3 3>&1
При таком написании Linux будет отображать ошибку, потому что & 3 еще не существует, так как он находится перед 3> & 1. 3> кое-что - это способ объявить (определить), что мы собираемся использовать третью трубу, поэтому она должна быть расположена до того, как мы потечем воду в эту трубу, например, так, как это написал Кайл. Попробуйте другой способ просто для удовольствия:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Жалко, что у вас нет возможности делать копии. Вы не можете делать такие вещи, как «3> & 1 3> & 2» в одной и той же команде, потому что Linux будет использовать только первый найденный и отклоняет второй.
Я (пока) не нашел способ отправить как ошибку, так и обычный вывод в файл, а также отправить копию ошибки на стандартный вывод с помощью одной команды. Для instace у меня есть задание cron, и я хочу, чтобы оба вывода (ошибка и стандартный) попадали в файл журнала и позволяли ошибке также выходить, чтобы отправить сообщение электронной почты на мой BlackBerry. Я могу сделать это двумя командами, используя «тройник», но ошибка не отображается в правильном порядке среди обычных строк вывода в файле. Я решил проблему таким уродливым способом:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Обратите внимание, что я должен использовать log1 дважды, и я должен добавить в обоих случаях, первый с использованием параметра «-a» для команды «tee» и второй с использованием «>>».
Делая кошка log1 вы получите следующее:
STD1
STD2
-bash: sdfr: command not found
Обратите внимание, что ошибка не отображается во второй строке, как должна.
согласно странице руководства для ksh (pdksh), вы можете просто сделать:
Команда 2> & 1> / dev / null | кошка -n
то есть dup stderr в stdout, перенаправить stdout в / dev / null, затем перенаправить в 'cat -n'
работает на pdksh в моей системе:
$ errorecho(){ echo "$@" >&2;} $ errorecho foo foo $ errorecho foo >/dev/null # should still display even with stdout redirected foo $ errorecho foo 2>&1 >/dev/null | cat -n 1 foo $
Я запустил его, как вы когда-либо хотели, так как он мне тоже был нужен, и я уточнил вашу команду. теперь для меня он работает правильно, используя bash 3.2 на сжатии debian, используя это
(echo "foo" 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1 >> log2
тогда как log1 регистрирует stdout, а stderr и log2 регистрирует только stderr и больше ничего не выводит на экран.