С 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 | Другая команда