Чтобы перенаправить стандартный вывод в усеченный файл в Bash, я знаю использовать:
cmd > file.txt
Чтобы перенаправить стандартный вывод в Bash, добавив в файл, я знаю использовать:
cmd >> file.txt
Чтобы перенаправить как stdout, так и stderr в усеченный файл, я знаю использовать:
cmd &> file.txt
Как перенаправить как stdout, так и stderr при добавлении в файл? cmd &>> file.txt
не работал для меня.
Ответы:
Bash выполняет перенаправления слева направо следующим образом:
>>file.txt
: Открытьfile.txt
в режиме добавления и перенаправитьstdout
туда.2>&1
: Перенаправитьstderr
на «кудаstdout
идет» . В данном случае это файл, открытый в режиме добавления. Другими словами,&1
повторно использует дескриптор файла, которыйstdout
используется в настоящее время.источник
cmd >>file1 2>>file2
это должно достичь того, что вы хотите.Есть два способа сделать это, в зависимости от вашей версии Bash.
Классический и портативный ( Bash pre-4 ) способ это:
Непортативный способ, начиная с Bash 4 :
(аналог
&> outfile
)Для хорошего стиля кодирования, вы должны
Если ваш сценарий уже начинается с
#!/bin/sh
(независимо от того, предназначен он или нет), то решение Bash 4 и вообще любой специфичный для Bash код не годятся.Также помните, что Bash 4
&>>
- просто более короткий синтаксис - он не вводит никакой новой функциональности или чего-то подобного.Синтаксис (помимо другого синтаксиса перенаправления) описан здесь: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
источник
sh
. Вы можете изменить оболочку по умолчанию, предваряяSHELL=/bin/bash
кcrontab -e
файлу.В Bash вы также можете явно указать ваши перенаправления в разные файлы:
Добавление будет:
источник
cmd >log.out 2>&1
. Я редактирую свой ответ, чтобы удалить первый пример.В Bash 4 (а также в ZSH 4.3.11):
просто из коробки
источник
Это должно работать нормально:
Он будет хранить все журналы в файле file.txt, а также выводить их на терминал.
источник
Попробуй это
Ваше использование &> x.file работает в 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
источник
You_command
в stdout, а stdoutYou_command
- в файлoutput.log
. Кроме того, он не будет добавлен в файл, но перезапишет его.1 > output.log 2>&1
Я удивлен, что за почти десять лет никто еще не опубликовал этот подход:
Если вы используете более старые версии bash там, где их
&>>
нет, вы также можете сделать:Это порождает подоболочку, поэтому она менее эффективна, чем традиционный подход
cmd >> file.txt 2>&1
, и, следовательно, не будет работать для команд, которым необходимо изменить текущую оболочку (напримерcd
,pushd
), но этот подход кажется мне более естественным и понятным:Кроме того, круглые скобки устраняют любую двусмысленность порядка, особенно если вы хотите вместо этого направить stdout и stderr в другую команду.
источник
cmd >> file 2>&1
работает во всех оболочках и не требует дополнительного процесса для запуска.