Respostas:
Sim, é possível, apenas redirecione a saída para um arquivo:
SomeCommand > SomeFile.txt
Ou se você deseja anexar dados:
SomeCommand >> SomeFile.txt
Se você também deseja stderr
usar isso:
SomeCommand &> SomeFile.txt
ou isto para acrescentar:
SomeCommand &>> SomeFile.txt
se você deseja stderr
exibir os dois e a saída no console e em um arquivo, use este:
SomeCommand 2>&1 | tee SomeFile.txt
(Se você deseja apenas a saída, solte a opção 2
acima)
make
comando em um arquivo, é necessário esta sintaxe: make > someFile.txt 2>&1
(fonte: linuxquestions.org/questions/linux-newbie-8/… )
Para gravar a saída de um comando em um arquivo, existem basicamente 10 maneiras comumente usadas.
Observe que a
n.e.
coluna na sintaxe significa "não existente".
Existe uma maneira, mas é muito complicado caber na coluna. Você pode encontrar um link útil na seção Lista sobre ele.
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
command > output.txt
O fluxo de saída padrão será redirecionado apenas para o arquivo, não estará visível no terminal. Se o arquivo já existir, ele será substituído.
command >> output.txt
O fluxo de saída padrão será redirecionado apenas para o arquivo, não estará visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.
command 2> output.txt
O fluxo de erro padrão será redirecionado apenas para o arquivo, não estará visível no terminal. Se o arquivo já existir, ele será substituído.
command 2>> output.txt
O fluxo de erro padrão será redirecionado apenas para o arquivo, não estará visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.
command &> output.txt
A saída padrão e o fluxo de erros padrão serão redirecionados apenas para o arquivo, nada será visível no terminal. Se o arquivo já existir, ele será substituído.
command &>> output.txt
A saída padrão e o fluxo de erros padrão serão redirecionados apenas para o arquivo, nada será visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.
command | tee output.txt
O fluxo de saída padrão será copiado para o arquivo, ainda estará visível no terminal. Se o arquivo já existir, ele será substituído.
command | tee -a output.txt
O fluxo de saída padrão será copiado para o arquivo, ainda estará visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.
(*)
O Bash não possui sintaxe abreviada que permite canalizar apenas StdErr para um segundo comando, o que seria necessário aqui em combinação com tee
novamente para concluir a tabela. Se você realmente precisa de algo assim, consulte "Como canalizar stderr, e não stdout?" no Stack Overflow, de algumas maneiras, como isso pode ser feito, por exemplo, trocando fluxos ou usando a substituição de processo.
command |& tee output.txt
A saída padrão e os fluxos de erro padrão serão copiados para o arquivo enquanto ainda estiverem visíveis no terminal. Se o arquivo já existir, ele será substituído.
command |& tee -a output.txt
A saída padrão e os fluxos de erro padrão serão copiados para o arquivo enquanto ainda estiverem visíveis no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.
2>&1
redireciona STDERR para STDOUT, 1>&2
redireciona STDOUT para STDERR e 3>&1
redireciona o fluxo 3 para STDERR.
sh: 1: Syntax error: "&" unexpected
quando uso |& tee
de um script Python em um servidor c9.io. Parece que um shell diferente está sendo usado. echo $SHELL
mostra /bin/bash
e $SHELL --version
mostra a versão 4.3.11 (1) - liberação. Eu tentei #!/bin/bash
no meu script python, mas ainda assim sh: 1: Syntax error
. Eu consegui o que precisava, então estou desistindo de classificar a estranheza entre sh
e bash
no meu servidor. Obrigado.
sh
e não bash
(ou talvez bash
no sh
modo ...). Você pode verificar exatamente o que seu processo de shell atual está usando ps -p $$ -o cmd=
, porque echo $SHELL
não é confiável e mostrará seu shell de login, ignorando se você pode ter iniciado um subshell diferente.
Você também pode usar tee
para enviar a saída para um arquivo:
command | tee ~/outputfile.txt
Uma leve modificação também trará stderr:
command 2>&1 | tee ~/outputfile.txt
ou um pouco mais curto e menos complicado:
command |& tee ~/outputfile.txt
tee
é útil se você deseja capturar a saída do comando enquanto a exibe ao vivo .
2>&1
?
Você pode redirecionar a saída do comando para um arquivo:
your_command >/path/to/file
Para acrescentar a saída do comando a um arquivo em vez de substituí-lo, use:
your_command >>/path/to/file
Uma melhoria a considerar -
Vários scripts injetam códigos de cores na saída, que você pode não querer desorganizar no seu arquivo de log.
Para corrigir isso, você pode usar o programa sed para remover esses códigos. Exemplo:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls
e grep
, suportam --color=auto
, que emitem códigos de cores somente se a saída padrão for um terminal.
Para cron
trabalhos, etc, você deseja evitar as extensões do Bash. Os sh
operadores de redirecionamento POSIX equivalentes são
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
Você notará que o recurso POSIX é, em certo sentido, mais simples e direto. A &>
sintaxe foi emprestada da csh
qual já deveria convencê-lo de que é uma má ideia.
some_command | tee command.log
e some_command > command.log
tenha o problema de que eles não salvam a saída do comando no command.log
arquivo em tempo real.
Para evitar esse problema e salvar a saída do comando em tempo real, você pode anexar o unbuffer
que acompanha o expect
pacote.
Exemplo:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Supondo que log.py
contenha:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
você pode correr unbuffer python log.py | tee command.log
ouunbuffer python log.py > command.log
Mais informações: Como salvar uma saída de comando em um arquivo em tempo real?
someCommand 2> someFile.txt
esomeCommand 2>> someFile.txt
também redirecionastterr
para someFile.txt