Как передать stderr по каналу, не передавая по каналу stdout

Вы попытались изменить владение каталога кому-то еще, затем обратно Bob? Совет Zoredache лучше, хотя - просто fsck это!

24
задан 9 September 2009 в 15:48
4 ответа

Чтобы сделать это, используйте один дополнительный дескриптор файла для переключения 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 кладите для первого удара копирует дескриптор файла 1, который был превращен в stderr.

26
ответ дан 28 November 2019 в 20:17
  • 1
    О, не протестированный с ksh, работами с ударом, хотя... –  Kyle Brandt 9 September 2009 в 16:00
  • 2
    Спасибо, работы в ksh также. Я думаю, большая часть канала и потоковых вещей являются posix стандартом. –  C. Ross 9 September 2009 в 16:14

согласно странице справочника для ksh (pdksh), можно просто сделать:

Команда 2> &1>/dev/null | кошка-n

т.е. копируйте stderr к stdout, перенаправьте stdout к/dev/null, затем передайте по каналу в 'кошку-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
$   
2
ответ дан 28 November 2019 в 20:17

Команда Unix/Linux Kyle делает задание переключения STDERR с STDOUT; однако объяснение является не совсем правильным. Операторы перенаправления не делают никакого копирования или дублирования, они просто перенаправляют поток к другому направлению.

При перезаписи команды Kyle временным перемещением 3> &1 в конец, помог бы понять понятие:

find /var/log  1>&2  2>&3  3>&1  

Записанный этот путь, хотя, Linux отобразил бы ошибку, потому что &3 еще не существует, поскольку это расположено прежде 3> &1. 3> что-то - способ объявить (определяют) это, мы собираемся использовать третий канал, таким образом, он должен быть расположен, прежде чем мы будем течь вода в тот канал, например, способ, которым Kyle записал это. Попробуйте этот другой путь только к забаве:

((echo "STD1";  anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR

Наличие способа сделать копии является позором. Вы не можете сделать вещей как "3> &1 3> &2" в той же команде, потому что Linux будет только использовать первый найденный и отклоняет второе.

Я еще не нашел способ отправить и ошибку и регулярный вывод в файл и также отправить копию ошибки к выводу standar с одной командой. Для instace у меня есть задание крона, что я хочу оба вывода (ошибка, и стандарт) переходят к файлу журнала и позволяют ошибке также выйти для создания электронного письма отправленным в мою ежевику. Я могу сделать это с двумя командами с помощью "мишени", но ошибка не показывает в правильном порядке среди регулярной выходной строки в файле. Это - ужасный способ, которым я разрешил проблему:

((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1

Обратите внимание, что я должен использовать log1 дважды, и я должен добавить в обоих случаях, ели одно использование "-a" опции для команды "мишени" и второго использования">>".

Выполнение кошки log1 Вы получает следующее:

STD1
STD2
-bash: sdfr: command not found

Заметьте, что ошибка не показывает во второй строке, как она должна.

13
ответ дан 28 November 2019 в 20:17

Я запустил его так, как вы когда-либо хотели, так как он мне тоже был нужен, и я уточнил вашу команду. теперь для меня это работает правильно, используя bash 3.2 на debian squeeze, используя этот

(echo "foo" 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1 >> log2

, тогда как log1 регистрирует stdout, а stderr и log2 регистрирует только stderr и ничего больше не выводит на экран.

1
ответ дан 28 November 2019 в 20:17

Теги

Похожие вопросы