См. Как передать stderr, а не stdout для получения большей части необходимой информации. Обратите внимание, в частности, на комментарий 'au contraire' . Помните, что все перенаправления завершаются до выполнения команды и перенаправления обрабатываются слева направо. (Конвейеры незначительно усложняют историю. В большинстве случаев перенаправление каналов стандартного вывода выполняется перед любым другим перенаправлением. Исключением является синтаксис, специфичный для Bash, |&
. Прочтите руководство Bash , руководстводетали - и затем не используйте |&
.)
Обратите внимание, что перенаправления могут быть расположены в любом месте командной строки относительно имени команды и аргументов. То есть:
<html> xml some -command
совпадает с
some -command <html >xml
и так далее. Таким образом, нет никакой разницы между первыми двумя командами в вопросе. (И я думаю, вы сами это выяснили.)
Первая команда в вопросе:
echo "Fatal error." >&2 2>asap
сначала перенаправляет стандартный вывод на текущую стандартную ошибку, затем перенаправляет стандартную ошибку нафайл (оставляя стандартный вывод, указывающий на исходную стандартную ошибку), а затем выполняет команду echo
. Сообщение отправляется в исходную стандартную ошибку (ваш терминал), а не в файл, потому что echo
не записывает в стандартную ошибку.
Последняя команда:
echo "Fatal error." 2>asap >&2
firstотправляет стандартную ошибку в файл, затем отправляет стандартный вывод в то же место, куда отправляется стандартная ошибка (файл), и затем выполняет команду echo
. Поскольку стандартный вывод идет в файл, на терминале ничего не видно.