Como redirecionar a saída para a tela e para um arquivo?

12

Meu objetivo é registrar toda a saída de um script em um diretório que o script criará.

Por exemplo, eu tenho:

~/.abc.sh:

#! /bin/bash
rails new myapp

Quando eu corro ...

cd ~/code
. ~/.abc.sh

... que vai criar uma nova aplicação Rails no diretório ~/code/myapp.

Quando o Rails está criando um aplicativo, ele gera um monte de texto que eu quero capturar e armazenar em um arquivo de log no mesmo diretório que o railscomando recém-criado. Também quero exibir esse texto no terminal.

Como faço para fazer isso?

Zabba
fonte

Respostas:

23

Você pode usar o teecomando para isso:

command | tee /path/to/logfile

O equivalente sem gravar no shell seria:

command > /path/to/logfile

Se você deseja acrescentar ( >>) e mostrar a saída no shell, use a -aopção:

command | tee -a /path/to/logfile

Observe que o tubo capturará apenas o padrão, os erros no stderr não serão processados ​​pelo tubo tee. Se você deseja registrar erros (do stderr), use:

command 2>&1 | tee /path/to/logfile

Isso significa: execute commande redirecione o fluxo stderr (2) para stdout (1). Isso será passado para o tubo com o teeaplicativo.

Lekensteyn
fonte
Você quer dizer ~/.abc.sh | tee <file>? Nesse caso, o problema é que não sei em qual diretório o script criará o aplicativo quando o chamo. Como saberia o que dar no fileargumento? (Graças para os grandes exemplos)
Zabba
@ Zabba: que tal criar um arquivo temporário e movê-lo depois?
Lekensteyn
Ok, isso deve funcionar :). Com relação a isso, como crio um arquivo temporário com um nome aleatório para o qual eu possa enviar e copiar para um local desejado posteriormente? Existe algum comando interno para obter um "nome do arquivo temporário"?
Zabba
@ Zabba: o comando para isso é mktemp. Veja a página do manual man mktemp.
Lekensteyn
Work, trabalhe como um encanto #
226
0

scriptiniciará uma sessão interativa e registrará toda a saída (stdout / stderr etc) em um arquivo, ou (com o -cparâmetro) executará um comando e registrará a saída dessa.

script -c ~/.abc.sh -f abc.log

Nota: em uma sessão interativa, você pode parar a gravação apenas saindo da sessão como faria normalmente (por exemplo, exitou Ctrl-D).

Para gravação de sessão com reprodução de vídeo, você também pode tentar o asciinema .

mwfearnley
fonte