Эти команды и символы часто можно встретить в терминале или скриптах. Разбираем по порядку, что означает каждый знак, куда уходит вывод и почему от порядка зависит результат.
Стандартные потоки
1 - stdout (нормальный вывод)
2 - stderr (ошибки)
Каждая команда в Linux работает с тремя потоками. Читает из stdin, пишет результат в stdout и выводит ошибки в stderr. Перенаправление (>, 2>, 2>&1) - это способ указать, куда именно должен идти каждый поток: в файл, в терминал или в никуда.
Символ '>' - направить вывод в файл
echo "hello" > log.txt
'>' создаёт (или перезаписывает) файл и отправляет туда стандартный вывод. Чтобы не затирать файл используйте '>>', он вставляет в конец:
echo "new line" >> log.txt
Символ '2>' - то же самое, но для ошибок
command 2> errors.txt
Здесь '2' - это номер потока stderr. Ошибки уйдут в errors.txt, а обычный вывод останется в терминале.
Объединение потоков: '2>&1'
command > all.txt 2>&1
'2>&1' значит отправить ошибки ('2') туда же, куда идёт обычный вывод ('1'). Порядок важен! Если написать наоборот (2>&1 > all.txt), ошибки всё равно пойдут в консоль, потому что в момент перенаправления stdout ещё не указывает на файл.
Сокращённая запись: '&>'
command &> all.txt
Эквивалент предыдущей команды, оба потока в один файл. Работает только в bash и zsh. Если ваш скрипт должен выполняться в sh или dash, используйте классическую форму.
/dev/null - "чёрная дыра"
command > /dev/null 2>&1
Команда выполняется, но вывод и ошибки никуда не сохраняются. Удобно для cron-задач, но не для отладки.
Вывод
Понимание потоков позволит писать устойчивые shell-скрипты и не терять данные.
LinuxCamp | #shell
