Перенаправление всего вывода в файл в Bash
Описание проблемы
Я сталкиваюсь с проблемой перенаправления вывода в Bash. Я знаю, что в Linux для перенаправления вывода с экрана в файл я могу использовать либо символ >
, либо команду tee
. Тем не менее, меня смущает тот факт, что часть вывода продолжает отображаться на экране, а не записывается в файл.
Вопрос: Есть ли способ перенаправить весь вывод (как стандартный, так и стандартный вывод ошибок) в файл?
Буду признателен за помощь!
5 ответ(ов)
Эта часть выводится в stderr, используйте 2>
для перенаправления. Например:
foo > stdout.txt 2> stderr.txt
или, если вы хотите сохранить всё в один файл:
foo > allout.txt 2>&1
Обратите внимание: это работает в (ba)sh, проверьте синтаксис для вашей оболочки.
Чтобы получить вывод как в консоль, так и в файл file.txt
, вы можете использовать следующую команду:
make 2>&1 | tee file.txt
Здесь 2>&1
перенаправляет стандартный поток ошибок (дескриптор 2
) в стандартный поток вывода (дескриптор 1
). Это означает, что как стандартный вывод, так и стандартный вывод ошибок будут объединены. Затем команда tee
копирует этот объединенный вывод в файл file.txt
, одновременно выводя его на консоль.
Обратите внимание, что символ &
в 2>&1
указывает на то, что 1
является дескриптором файла, а не именем файла.
Вы можете использовать следующую команду для перенаправления вывода и ошибок в файл:
"require command here" > log_file_name 2>&1
В этой команде "require command here" — это ваша команда, которая генерирует вывод. Оператор >
перенаправляет стандартный вывод (stdout) в файл log_file_name
. Чтобы перенаправить также стандартный поток ошибок (stderr), используется 2>&1
, что означает "перенаправить поток ошибок (2) туда же, куда идет стандартный вывод (1)".
Подробное описание операторов перенаправления в Unix/Linux:
>
— перенаправляет стандартный вывод (stdout) в файл.>>
— добавляет стандартный вывод к существующему файлу (вместо его перезаписи).1>
— явно указывает перенаправление стандартного вывода в файл (прим.1
обозначает stdout).2>
— перенаправляет стандартный поток ошибок (stderr) в файл.&>
— перенаправляет как стандартный вывод, так и стандартный поток ошибок в файл.
Также стоит отметить /dev/null
— это специальное устройство, которое принимает любой ввод и просто выбрасывает его. Его можно использовать для подавления вывода. Например:
"require command here" > /dev/null 2>&1
Эта команда выполнит вашу команду, но никакой вывод или ошибки не будут видны, так как они оба перенаправляются в "пустоту".
Кредиты osexp2003 и j.a. …
Вместо того чтобы добавлять:
&>> your_file.log
в конце строки в:
crontab -e
я использую:
#!/bin/bash
exec &>> your_file.log
…
в начале BASH скрипта.
Преимущество: Вы определяете логирование внутри своего скрипта. Это удобно для Git и других систем контроля версий.
Вы можете использовать команду exec
, чтобы перенаправить весь вывод stdout
и stderr
для любых последующих команд.
Пример скрипта:
exec 2> your_file2 > your_file1
ваши другие команды.....
В этом примере все стандартные ошибки будут записываться в файл your_file2
, а стандартный вывод — в файл your_file1
. После выполнения команды exec
все команды, которые будут выполняться после нее, будут использовать это перенаправление.
Как изменить цвет вывода echo в Linux
Как перенаправить вывод в файл и на экран (stdout)
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?