Эхо в stderr и вывод stderr в файл - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь отобразить выходные данные в stderr и перенаправить stderr в файл одновременно, я заметил, что порядок перенаправления имеет значение, но я не понимаю, почему так должно быть.

Файл asap пуст с помощью одной из следующих команд:

echo "Fatal error." >&2 2>asap
echo >&2 "Fatal error." 2>asap

Но это работает, регистрируя "Фатальную ошибку" в файле asap.

echo "Fatal error." 2>asap >&2

Почему

Ответы [ 2 ]

2 голосов
/ 10 ноября 2019

Перенаправления происходят слева направо, поэтому они могут действовать по-разному в зависимости от размещения.

Например, две команды:

runme >somefile 2>&1
runme 2>&1 >somefile

имеют различных эффектов из-запорядок.

Первый указывает стандартный вывод на файл somefile, , затем стандартная ошибка на этот новый стандартный вывод (файл).

Второй указывает стандартошибка в текущем стандартном выводе (терминал, скорее всего) , тогда указывает стандартный вывод на файл.

2 голосов
/ 10 ноября 2019

См. Как передать 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. Поскольку стандартный вывод идет в файл, на терминале ничего не видно.

...