Como exibir a saída de uma linha de comando no console e salvar a saída em um arquivo de texto?

25

Como posso executar sudo apt-get installpor AMBOS vendo o processo de instalação (longa no meu caso) e salvar a sua saída em um arquivo de texto?


fonte
É apenas apt-getcerto?
Braiam
@Braiam Acho que a solução que aceitei pode ser aplicada a todos os outros comandos, você acha?

Respostas:

17

use o scriptcomando Ele copiará tudo o que for exibido na tela em um arquivo

script -c "sudo apt-get install things" script-file.script
exore
fonte
scriptenvia a saída do comando para um arquivo, mas não a mostra na tela.
Aaron
2
@ BryceAtNetwork23. Você tentou o comando? roteiro faz saída de envio para a tela.
exore 19/06/14
1
Eu fiz. Corri script -c "history" ~/hist.txte vi a saída indicando Script startede Script done, mas não vi a saída do comando real na tela.
Aaron
10
@ BryceAtNetwork23 historyé um shell builtint, não um comando externo. O que acontece é: 1) o script é iniciado, 2) o script pesquisa o comando history, não o encontra, portanto acha que deve ser executado por meio de um shell. 3) o script executa o comando history através de um shell 4) um novo shell é iniciado e executa o comando interno do histórico. Como esse é um novo shell não interativo, a história não tem nada a dizer.
exore 19/06/14
1
scripttambém pode ser executado interativamente. Basta digitar scriptno prompt de comando. Você receberá um novo shell, e qualquer comando digitado terá sua saída salva. Digite exitpara finalizar o shell e salve o arquivo. Por padrão, a saída é chamada typescripte conterá tudo o que é mostrado na tela, independentemente de você ter digitado ou se foi a saída de um comando. O historycomando ainda deve estar disponível no novo shell também.
18711 Brian Minton
52

Você pode usar o teecomando para fazer isso.

sudo apt-get install someapp 2>&1 | tee ~/someappInstall.txt

Procure aqui mais informações ou executeman tee

Nota: Como outros já mencionaram, 2>&1é necessário redirecionar STDERR para STDOUT para detectar erros. Veja esta pergunta StackOverflow para uma boa explicação do que 2>&1realmente faz.

Aaron
fonte
Eu adicionaria "2> & 1" antes do "|"
Olivier Dulac
2
Isso é mais prático do que scriptporque o comando não precisa ser citado. Portanto, vantagens como a conclusão do bash são mais fáceis de obter.
Dan
2
O @Dan: script não precisa do -c "something ...": if, você será direcionado para um shell e finalizado quando você sair desse shell. Permite vários comandos, etc. Além disso, mantém mais informações de "formatação", permitindo a reprodução de mais algumas coisas (como: tela limpa, etc.) (mas que também podem atrapalhar a saída ... ymmv)
Olivier Dulac
2
O @Dan + trabalha com funções, aliases, builtins e até grupos de comandos e subshells. Esta deve ser a resposta aceita IMO.
Darkhogg
1
você pode usar em |&vez de 2>&1 |no bash
jfs
15

tee fará o trabalho conforme necessário.

Para capturar a saída em um arquivo, use:

sudo apt-get install your_software | tee log_file.txt

Isso capturará apenas a saída, mas não nenhuma mensagem de erro. Se você também deseja gravar mensagens de erro, modifique o comando para:

sudo apt-get install your_software 2>&1  | tee log_file.txt
Alex C
fonte
Ou, como bash suporta o |&operador , sudo apt-get install your_software |& tee log_file.txtcanalizará stdout e stderr para tee. (Kudos para JF Sebastian quem sugeriu isso em outro lugar .)
Elias Kagan
9

Uma das vantagens do apt-get (e do APT em geral) é que eles armazenam arquivos de log para quase tudo, até a saída do terminal de qualquer comando que você executa através do /var/log/apt. Por exemplo, esta é a última entrada no meu /var/log/apt/term.log:

Log started: 2014-06-20  16:46:08
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Log ended: 2014-06-20  16:46:33

Agora, comparando com a saída real:

➜  ~  sudo apt-get remove xdotool 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libxdo3
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  xdotool
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 135 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...

Isso me salvou várias linhas que não são relevantes na maioria dos casos, e isso acontece automaticamente. Portanto, você não precisa de nenhum comando extra para fazer o que deseja, o apt-get faz isso por você.

Braiam
fonte
1

tente o comando tee . Você pode encontrar aqui alguns exemplos.

Uso simples:

  <command> | tee file

exemplo:

  sudo apt-get install whatYouWant | tee outputFile
Lety
fonte