Перенаправления в shell
Вопрос
Расскажи, как в shell перенаправить вывод и ошибки, и приведи частые ловушки.
Попробуйте сами
Ответьте вслух за 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 ошибок.