Сегодня речь пойдет о том, как перенаправить вывод команды в файл. К примеру, нам надо логировать вывод команды, которая, к примеру работает в Кроне.
На самом деле именно Крон — это то место, где команды работают в фоне и можно впервые столкнуться с проблемой непонимание результатов выполнения таска.
Итак. У программ есть три потока:
— STDIN или 0 — поток ввода.
— STDOUT или 1 — поток вывода. Это всё, что выводит программа.
— STDERR или 1 — поток ошибок. Это, скажем, системные ошибки при выполнении.
Сейчас речь пойдет о потоках вывода и ошибок.
Итак, для того, чтобы перенаправить вывод нужно использовать символ >. Да, просто знак больше и путь к файлу, куда мы хотим направить вывод.
Например:
whoami > /tmp/whoiami.dat
Этот просто пример демонстрирует, как можно вызвать команду и перенаправить вывод. В результате её выполнения на экране ничего не окажется — но по указанному пути появится файл с содержимым того самого вывода.
Попробуйте выполнить whoami без перенаправления, а затем с ним. И вы точно поймете о чем речь.
Также Вы можете указать номер потока при выводе. Строки ниже — идентичны:
whoami > /tmp/whoiami.dat whoami 1> /tmp/whoiami.dat
Просто мы указываем, КАКОЙ именно поток хотим обработать.
Это актуально, когда Вам нужно перенаправить не только вывод, но и потом ошибок. К примеру, если Вы в Кроне укажите программу, которой нет в глобальном пространстве — ошибка будет не видна. В зависимости от настроек системы она может быть в общем логе Крона — но мы говорим о другом случае.
Буквально недавно был случай, когда задача крутилась в кроне, направление вывода давало просто пустой файл. А копипаст команды с таска в консоль — отлично отрабатывал. Решение крылось в том, что нужно было указать абсолютный путь к выполняемому файлу, но т.к. поток вывода был пустым — узнать об этом удалось только после перенаправления также потока ошибок.
whoami 2> /tmp/whoiami.dat
Для перенаправления обеих потоков:
# в разные файлы whoami 1> /tmp/whoiami_out.dat 2> /tmp/whoiami_err.dat # в один файл (вариант 1) whoami > /tmp/whoami.log 2>&1 # в один файл (вариант 2) whoami &> /tmp/whoami.log
Ну и в конце добавлю, что символ > всегда переписывает файл. Для того, чтобы вывод был «накопительным» — т.е. происходила дозапись в файл, а не ег оперепись — используйте два знака больше >>.
Вот такая история с перенаправлением вывода и ошибок в файл в Linux. Если статья была полезной, или остались вопросы или, наоборот, я в чем-то ошибся — добро пожаловать в комментарии.