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

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

cmd > file.txt

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

cmd >> file.txt

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

cmd &> file.txt

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

6 ответов


cmd >>file.txt 2>&1

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

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

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

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

cmd >> outfile 2>&1

непортящийся способ, начиная с Баш 4 is

cmd &>> outfile

(аналог &> outfile)

для хорошего стиля программирования, вы должны

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

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

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

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


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

cmd >log.out 2>log_error.out

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

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

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

cmd &>>outfile

только что из коробки


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

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

он будет хранить все журналы в .txt а также сбросить их на терминал.


попробуй такое

You_command 1>output.log  2>&1

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

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

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

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

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

использование: file_descriptor>> имя файла | &file_descriptor>

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