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, в котором я хочу, чтобы оба вывода (error и standard) заносились в файл журнала и позволяли также сообщать об ошибке, чтобы отправить сообщение электронной почты на мой blackBerry. Я могу сделать это с помощью двух команд, используя «tee», но ошибка не отображается в правильном порядке среди обычной строки вывода в файле. Это уродливый способ, которым я решил проблему:
((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
Обратите внимание, что ошибка не отображается во второй строке, как следует.