Назад | Перейти на главную страницу

Как подключить stderr без вывода stdout

Как передать стандартный поток ошибок, не передавая стандартный выходной поток?

Я знаю, что эта команда работает, но она также записывает стандарт.

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 и больше ничего не выводит на экран.