9

Перенаправление всего вывода в файл в Bash

4

Описание проблемы

Я сталкиваюсь с проблемой перенаправления вывода в Bash. Я знаю, что в Linux для перенаправления вывода с экрана в файл я могу использовать либо символ >, либо команду tee. Тем не менее, меня смущает тот факт, что часть вывода продолжает отображаться на экране, а не записывается в файл.

Вопрос: Есть ли способ перенаправить весь вывод (как стандартный, так и стандартный вывод ошибок) в файл?

Буду признателен за помощь!

5 ответ(ов)

14

Эта часть выводится в stderr, используйте 2> для перенаправления. Например:

foo > stdout.txt 2> stderr.txt

или, если вы хотите сохранить всё в один файл:

foo > allout.txt 2>&1

Обратите внимание: это работает в (ba)sh, проверьте синтаксис для вашей оболочки.

1

Чтобы получить вывод как в консоль, так и в файл file.txt, вы можете использовать следующую команду:

make 2>&1 | tee file.txt

Здесь 2>&1 перенаправляет стандартный поток ошибок (дескриптор 2) в стандартный поток вывода (дескриптор 1). Это означает, что как стандартный вывод, так и стандартный вывод ошибок будут объединены. Затем команда tee копирует этот объединенный вывод в файл file.txt, одновременно выводя его на консоль.

Обратите внимание, что символ & в 2>&1 указывает на то, что 1 является дескриптором файла, а не именем файла.

0

Вы можете использовать следующую команду для перенаправления вывода и ошибок в файл:

"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

Эта команда выполнит вашу команду, но никакой вывод или ошибки не будут видны, так как они оба перенаправляются в "пустоту".

0

Кредиты osexp2003 и j.a. …


Вместо того чтобы добавлять:

&>> your_file.log

в конце строки в:

crontab -e

я использую:

#!/bin/bash
exec &>> your_file.log
…

в начале BASH скрипта.

Преимущество: Вы определяете логирование внутри своего скрипта. Это удобно для Git и других систем контроля версий.

0

Вы можете использовать команду exec, чтобы перенаправить весь вывод stdout и stderr для любых последующих команд.

Пример скрипта:

exec 2> your_file2 > your_file1
ваши другие команды.....

В этом примере все стандартные ошибки будут записываться в файл your_file2, а стандартный вывод — в файл your_file1. После выполнения команды exec все команды, которые будут выполняться после нее, будут использовать это перенаправление.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь