Como capturar as saídas da shell?

4

Estamos projetando um shell no navegador que transmitirá tudo o que o shell produz. stdout, stderr, qualquer coisa.

no entanto, assim como este pequeno exemplo demonstraria para você,

git clone https://github.com/joyent/node.git >./git.out 
cat ./git.out

a maior parte da saída não é fornecida para ./git.out. aqui está um pequeno vídeo, se você quiser ver o que está acontecendo link

Precisamos de comandos como 'top', 'git' to work, alguma ideia de como obtê-los?

(produzir em um arquivo é apenas para fins de ilustração, vamos transmitir cada linha de saída para outro sistema, sabemos que top não faria sentido, mas espero que meu ponto seja claro o suficiente para o aqueles que podem fornecer informações, obrigado.)

    
por Devrim 03.07.2011 / 17:19

1 resposta

10

A maioria dos programas tem duas saídas: stdout e stderr. stdout é onde a informação "principal" vai. stderr é usado para, bem, erros. Ele também é usado para diversas saídas não importantes, e também coisas como prompts de usuário, às vezes.

Para capturar tudo isso, você precisa redirecionar o stderr para o stdout.

somecmd arg1 arg2 arg3 >somefile 2>&1

Ou para capturar stderr para um arquivo separado:

somecmd arg1 arg2 arg3 >stdout.txt 2>stderr.txt

Esteja ciente de que é possível para um programa usar outras saídas que stdout / stderr. Ele pode determinar seu console e basicamente "forçar" a saída lá. No entanto, isso é extremamente incomum, e o acima funcionará em 99% das situações.

Uma coisa a ter em mente se você redirecionar stdout e stderr para o mesmo arquivo é stdout e stderr buffer de forma diferente, assim não será o mesmo em um arquivo de log como na tela (as linhas serão fora de serviço). Além disso, para sua instância específica, sua saída será parecida com lixo. git faz um monte de manipulação de terminal (para o indicador de progresso) e em um arquivo de log vai parecer horrível.

EDITAR

De man git-clone :

--progress
Progress status is reported on the standard error stream by default when it is attached to a terminal, unless -q is specified. This flag forces progress status even if the standard error stream is not directed to a terminal

    
por 03.07.2011 / 18:04

Tags