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

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

cmd > file.txt

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

cmd >> file.txt

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

cmd &> file.txt

Как перенаправить как стандартный вывод , так и стандартный вывод при добавлении в файл? cmd &>> file.txt не работает для меня.

вопрос задан 18.05.2009
flybywire
91163 репутация

6 ответов


  • 1604 рейтинг
    cmd >>file.txt 2>&1
    

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

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

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

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

    cmd >> outfile 2>&1
    

    Непортативный способ, начиная с Bash 4 это

    cmd &>> outfile
    

    (аналог &> outfile)

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

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

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

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

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

    ответ дан TheBonsai, с репутацией 9221, 18.05.2009
  • 76 рейтинг

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

    cmd >log.out 2>log_error.out
    

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

    cmd >>log.out 2>>log_error.out
    
    ответ дан Aaron R., с репутацией 2442, 24.07.2013
  • 57 рейтинг

    В Bash 4 (а также ZSH 4. 3. 11):

    cmd &>>outfile
    

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

    ответ дан A B, с репутацией 1262, 27.03.2012
  • 36 рейтинг

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

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

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

    ответ дан Pradeep Goswami, с репутацией 938, 12.12.2015
  • 20 рейтинг

    Попробуйте это

    You_command 1>output.log  2>&1
    

    Ваше использование & amp; & gt; x. Файл работает в Bash4. извините за это: (

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

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

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

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

    Использование: & Lt; file_descriptor & gt; & gt; & lt; имя файла | & file_descriptor & gt;

    Пожалуйста, обратитесь к http: // www. TLDP. орг / ЛДП / ABS / HTML / IO-перенаправление. HTML

    ответ дан Quintus.Zhou, с репутацией 568, 10.04.2014