Это про стандартные потоки вывода. Они имеют файловые дескрипторы:
stdout — 1 (общий поток вывода)
stderr — 2 (поток с ошибками)
Получается (2>&1) = stderr > stdout — направляем поток с ошибками в стандартный поток вывода. Ошибки будут выводиться на экран в терминале.
🤔 Логичным было бы сделать конструкцию 2>1. Но увы, эта схема отработает другую логическую операцию. Поток с ошибками stderr будет писать все данные в файл, у которого название будет 1.
Для этого и требуется указать символ
& (амперсанд) перед stdout. Это будет интерпретировано как файловый дескриптор, а не обычный файл.🤔 А почему тогда не &2>&1 ?
Символ
& интерпретируется как файловый дескриптор только в контексте перенаправления.Операция
command &2>&1 анализируется следующим образом. command & 2>&1 — команда command будет выполнятся в фоновом режиме. А затем начнет выполнятся команда 2 с перенаправлением на стандартный вывод stdout.Есть альтернатива с оператором |&.
|& это сокращенный вариант от 2>&1 |Пример:
script.sh |& tee -a /var/log/script.log
Все что
script.sh выведет в потоки stdout и stderr, будет перенаправлено в файл script.log.В официальной документации можно подробнее изучить эту штуку.