С bash, как я могу передать стандартную ошибку в другой процесс?


хорошо известно, как передать стандартный вывод процесса в другой стандартный ввод процессов:

proc1 | proc2

но что, если я хочу отправить стандартную ошибку proc1 в proc2 и оставить стандартный вывод в его текущем местоположении? Можно подумать bash будет иметь команду по линиям:

proc1 2| proc2

но, увы, нет. Есть ли способ сделать это?

4 104

4 ответа:

есть еще подмена процесса. Что делает процесс заменой файла.
Вы можете отправить stderr в файл следующим образом:

process1 2> file

но вы можете заменить процесс для файла следующим образом:

process1 2> >(process2)

вот конкретный пример, который отправляет stderr как на экране, так и в приложении к файлу журнала

sh myscript 2> >(tee -a errlog)

вы можете использовать следующий трюк, чтобы обменstdout и stderr. Затем вы просто используете обычную функциональность трубы.

( proc1 3>&1 1>&2- 2>&3- ) | proc2

при условии stdout и stderr оба указали на одно и то же место в начале, это даст вам то, что вам нужно.

что он делает:

  • 3>&1 создает новый дескриптор файла 3 который установлен в текущий 1 (первоначальный стандартный вывод) просто сохраните его куда-нибудь.
  • 1>&2- устанавливает stdout для получения текущего дескриптора файла 2 (оригинальный stderr) затем закрывается 2.
  • 2>&3- устанавливает stderr для получения текущего дескриптора файла 3 (оригинальный stdout) затем закрывается 3.

это фактически команда подкачки, которую вы видите в сортировке:

temp   = value1;
value1 = value2;
value2 = temp;

Bash 4 имеет эту функцию:

Если используется`|&', стандартная ошибка command1 подключается к стандартному входу command2 через трубу; это сокращение для 2>&1 |. Это неявное перенаправление стандартной ошибки выполняется после всех перенаправлений, указанных командой.

zsh также имеет эту функцию.

--

с другими / более старыми оболочками, просто введите это явно как

FirstCommand 2>&1 | Другая команда

замена велика, как это решает проблему. На всякий случай вам даже не нужен оригинальный stdout, вы можете сделать это следующим образом:

proc1 2>&1 1>/dev/null | proc2

порядок жизненно важен; вы бы не хотели:

proc1 >/dev/null 2>&1 | proc1

как это перенаправит все на /dev/null!