Para redirecionar stdout para um arquivo truncado no Bash, eu sei usar:
cmd > file.txt
Para redirecionar stdout no Bash, anexando a um arquivo, eu sei usar:
cmd >> file.txt
Para redirecionar stdout e stderr para um arquivo truncado, eu sei usar:
cmd &> file.txt
Como redireciono stdout e stderr anexando a um arquivo? cmd &>> file.txt
não funcionou para mim.
Respostas:
O Bash executa os redirecionamentos da esquerda para a direita da seguinte maneira:
>>file.txt
: Abrafile.txt
no modo de acréscimo e redirecione parastdout
lá.2>&1
: Redirecionestderr
para "stdout
para onde está indo atualmente" . Nesse caso, esse é um arquivo aberto no modo de acréscimo. Em outras palavras,&1
reutiliza o descritor de arquivo questdout
atualmente usa.fonte
cmd >>file1 2>>file2
isso, deve conseguir o que deseja.Existem duas maneiras de fazer isso, dependendo da sua versão do Bash.
A maneira clássica e portátil ( Bash pré-4 ) é:
Uma maneira não portável, começando com o Bash 4, é
(analógico para
&> outfile
)Para um bom estilo de codificação, você deve
Se o seu script já começar
#!/bin/sh
(não importa se isso é pretendido ou não), a solução Bash 4 e, em geral, qualquer código específico do Bash, não é o caminho a seguir.Lembre-se também de que o Bash 4
&>>
é apenas uma sintaxe mais curta - ele não apresenta nenhuma nova funcionalidade ou algo parecido.A sintaxe é (ao lado de outra sintaxe de redirecionamento) descrita aqui: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
fonte
sh
. Você pode alterar o shell padrão anexandoSHELL=/bin/bash
aocrontab -e
arquivo.No Bash, você também pode especificar explicitamente seus redirecionamentos para arquivos diferentes:
Anexar seria:
fonte
cmd >log.out 2>&1
. Estou editando minha resposta para remover o primeiro exemplo.No Bash 4 (assim como no ZSH 4.3.11):
apenas fora da caixa
fonte
Isso deve funcionar bem:
Ele armazenará todos os logs no arquivo.txt e os despejará no terminal.
fonte
Tente isto
Seu uso do &> x.file funciona no bash4. Desculpe por isso : (
Aqui estão algumas dicas adicionais.
0, 1, 2 ... 9 são descritores de arquivo no bash.
0 significa
stdin
, 1 significastdout
, 2 significastderror
. 3 ~ 9 é de reposição para qualquer outro uso temporário.Qualquer descritor de arquivo pode ser redirecionado para outro descritor ou arquivo usando o operador
>
ou>>
(anexar).Uso: < file_descriptor > > < filename | & file_descriptor >
Consulte http://www.tldp.org/LDP/abs/html/io-redirection.html
fonte
You_command
para stdout e o stdout deYou_command
para o arquivooutput.log
. Além disso, ele não será anexado ao arquivo, mas o substituirá.1 > output.log 2>&1
Estou surpreso que, em quase dez anos, ninguém postou essa abordagem ainda:
Se estiver usando versões mais antigas do bash, onde
&>>
não estiver disponível, você também poderá:Isso gera um subshell, portanto é menos eficiente do que a abordagem tradicional
cmd >> file.txt 2>&1
e, consequentemente, não funcionará para comandos que precisam modificar o shell atual (por exemplocd
,pushd
), mas essa abordagem parece mais natural e compreensível para mim:Além disso, os parênteses removem qualquer ambiguidade de ordem, especialmente se você deseja canalizar stdout e stderr para outro comando.
fonte
cmd >> file 2>&1
funciona em todos os shells e não precisa de um processo extra para ser executado.