Ответ вслух Junior Потоки и пайпы спрашивают часто обновлено

Перенаправления в shell

Вопрос

Расскажи, как в shell перенаправить вывод и ошибки, и приведи частые ловушки.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

У процесса три стандартных дескриптора: 0 ввод, 1 вывод, 2 ошибки. Shell до запуска команды настраивает, куда они смотрят. отправляет stdout в файл с перезаписью, дописывает, 2 перенаправляет ошибки, < подаёт файл на вход.

Что должно прозвучать в ответе

  • Три дескриптора: 0 stdin, 1 stdout, 2 stderr

  • `>` перезаписывает, `>>` дописывает, `2>` для ошибок, `<` для ввода

  • `> file 2>&1` объединяет потоки, порядок важен: перенаправления слева направо

  • Пайп передаёт только stdout, для ошибок нужен `2>&1 |`

  • `sudo cmd > /etc/x` не работает: файл открывает shell без прав, используют `| sudo tee`

  • `/dev/null` для выбрасывания ненужного вывода

Что могут спросить следом

  • Как сохранить вывод в файл и одновременно видеть его?
  • Что делает &>?
  • Как записать в файл несколько строк из скрипта?

Разбор

У процесса три стандартных дескриптора: 0 ввод, 1 вывод, 2 ошибки. Shell до запуска команды настраивает, куда они смотрят. > отправляет stdout в файл с перезаписью, >> дописывает, 2> перенаправляет ошибки, < подаёт файл на вход. Чтобы собрать всё в один файл, пишут > file 2>&1, и порядок важен: 2>&1 копирует текущее назначение stdout, поэтому если поставить его первым, ошибки уйдут в терминал. В bash есть короткая форма &>. Пайп передаёт только stdout, поэтому ошибки в grep не попадут без 2>&1. Частая ловушка с sudo: перенаправление выполняет мой shell, а не sudo, поэтому пишут echo ... | sudo tee файл. tee вообще удобен, когда нужно и видеть вывод, и сохранить его. Ненужное отправляют в /dev/null.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме