Читая о Linux, я получил следующее:
Поскольку stderr — это не то же самое, что stdout, сообщения об ошибках все равно будут отображаться в окнах терминала в приведенном выше примере.
Если вы хотите перенаправить stderr в отдельный файл, используйте номер файлового дескриптора stderr (2), знак «больше» (>), за которым следует имя файла, в котором вы хотите сохранить все, что запущенная команда записывает в stderr:
$ do_something 2> error-file
Для помещения всего, что записано в файловый дескриптор 2 (stderr), в то же место, что и файловый дескриптор 1 (stdout), можно использовать специальную сокращенную запись: 2>&1
$ do_something > all-output-file 2>&1
bash допускает более простой синтаксис для вышеприведенного:
$ do_something >& all-output-file
Вот do_something
некоторая команда. Я действительно не понимаю, что происходит внизу во всех 3 командах, указанных выше. Я знаю, &
что используется для того, чтобы сделать процесс фоновым, но я не понимаю логику. Я новичок в этом деле. Может кто-нибудь объяснить это?
решение1
Ваше замешательство может быть вызвано тем, что >&
это совершенно иное явление, чем &
.
>&
или <&
используются при перенаправлении для указания на файловый дескриптор (fd). В приведенных выше случаях выполняется перенаправление на 1 и 2, которые являются stdout и stderr соответственно.
>
означает «перенаправить stdout»
2>
означает «перенаправить fd 2 (stderr)»
>&2
означает "перенаправить stdout в fd 2 (stderr)". Обратите внимание, как это отличается от >2
того, что означало бы "перенаправить stdout в файл с именем 2
" -- вот почему &
важно. Это указывает, что следующим будет fd, а не имя файла.
Конечно, как вы заметили, если a &
стоит сам по себе без символа перенаправления, то это означает нечто совершенно иное — «немедленно вернуться, выполнить предыдущую команду в фоновом режиме».