Respostas:
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
scriptenvia a saída do comando para um arquivo, mas não a mostra na tela.
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.
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.
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.
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.
scriptporque o comando não precisa ser citado. Portanto, vantagens como a conclusão do bash são mais fáceis de obter.
-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)
|&vez de 2>&1 |no bash
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
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 .)
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ê.
apt-getcerto?