Как я могу перенаправить и добавить как 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.