Как я могу перенаправить и добавить как stdout, так и stderr в файл с Bash?

Чтобы перенаправить stdout в усеченный файл в Bash, я знаю, что нужно использовать:

cmd > file.txt

Чтобы перенаправить stdout в Bash, добавив к файлу, я знаю, что нужно использовать:

cmd >> file.txt

Чтобы перенаправить оба stdout и stderr в усеченный файл, я знаю, что нужно использовать:

cmd &> file.txt

Как перенаправить оба файла stdout и stderr в файл? cmd &>> file.txt не работал у меня.

Ответ 1

cmd >>file.txt 2>&1

Bash выполняет перенаправления слева направо следующим образом:

  • >>file.txt: Откройте file.txt в режиме добавления и переадресуйте stdout там.
  • 2>&1: Перенаправить stderr в "где stdout в настоящее время идет". В этом случае это файл, открытый в режиме добавления. Другими словами, &1 повторно использует дескриптор файла, который в настоящее время использует stdout.

Ответ 2

Есть два способа сделать это, в зависимости от вашей версии Bash.

Классический и портативный (Bash pre-4) способ:

cmd >> outfile 2>&1

Непортируемый путь, начиная с Bash 4,

cmd &>> outfile

(аналог &> outfile)

Для хорошего стиля кодирования вы должны

  • решить, является ли переносимость проблемой (тогда используйте классический способ)
  • решить, является ли переносимость даже до Bash pre-4 проблемой (тогда используйте классический способ).
  • независимо от того, какой синтаксис вы используете, не изменяйте его в пределах того же script (путаница!)

Если ваш script уже начинается с #!/bin/sh (независимо от того, предназначено или нет), то решение Bash 4 и вообще любой Bash -специфический код не подходит.

Также помните, что Bash 4 &>> - это просто более короткий синтаксис - он не вводит никаких новых функций или чего-либо подобного.

Синтаксис (помимо другого синтаксиса перенаправления), описанный здесь: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output

Ответ 3

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

cmd >log.out 2>log_error.out

Добавление будет:

cmd >>log.out 2>>log_error.out

Ответ 4

В Bash 4 (а также ZSH 4.3.11):

cmd &>>outfile

просто из коробки

Ответ 5

Это должно работать нормально:

your_command 2>&1 | tee -a file.txt

Он сохранит все журналы в файле file.txt, а также сбросит их на терминал.

Ответ 6

Попробуй это

You_command 1>output.log  2>&1

Ваше использование файла &> x.file работает в bash4. простите за это: (

Вот несколько дополнительных советов.

0, 1, 2... 9 - файловые дескрипторы в bash.

0 означает stdin, 1 означает stdout, 2 - stderror. 3 ~ 9 является запасным для любого другого временного использования.

Любой файловый дескриптор можно перенаправить в другой файловый дескриптор или файл с помощью оператора > или >> (добавить).

Использование: < file_descriptor >> < filename | & file_descriptor >

Пожалуйста, обратитесь к http://www.tldp.org/LDP/abs/html/io-redirection.html.