С bash, как я могу передать стандартную ошибку в другой процесс?
хорошо известно, как передать стандартный вывод процесса в другой стандартный ввод процессов:
proc1 | proc2
но что, если я хочу отправить стандартную ошибку proc1 в proc2 и оставить стандартный вывод в его текущем местоположении? Можно подумать bash
будет иметь команду по линиям:
proc1 2| proc2
но, увы, нет. Есть ли способ сделать это?
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 | Другая команда