Linux Pipe, mensagens de aviso, stdout

3

Este é provavelmente o melhor lugar para fazer a pergunta em sua forma mais simples. Eu estou escrevendo um script que leva a saída de um comando e coloca em uma variável. Depois de alguma depuração eu descobri o comando quando os erros não foram para stdout, mas para o console (ou parede). Veja o exemplo abaixo:

Quando o comando é executado com sucesso

root@local# apcaccess status
APC : 700
VERSION : xxxxx
BATTSTAT : AC

Quando o comando errar

root@local# apcaccess status
apcupsd @ localhost: Connection Refused.

root@local# apcaccess status | grep -i version
apcupsd @ localhost: Connection Refused.

Tenho notado quando tento canalizar o comando através do grep 'apcaccess status | grep -i version 'Vou obter o número da versão em uma execução bem-sucedida, mas no sistema em que ocorre o erro, recebo a mensagem de erro. Eu acredito que não está passando por stdout.

A questão é: como posso forçar a saída a ir para stdout?

    
por jinanwow 08.07.2011 / 01:27

2 respostas

6
# apcaccess status 2>&1 | grep -i version

Isto irá redirecionar o stderr para o stdout, então o grep irá ver a saída.

    
por 08.07.2011 / 01:29
2

A razão é que existem dois descritores de arquivos abertos que "imprimem" em sua tela. stdout (representado pelo descritor de arquivo 1) e stderr (descritor de arquivo 2). Quando você canaliza um comando para outro, simplesmente pega o stdout do primeiro comando e "canaliza" como stdin para o segundo comando. Mas se o primeiro comando imprimiu algo para stderr (geralmente uma mensagem de erro) do que não é passado pelo tubo, mas impresso diretamente na tela.

Então você precisa redirecionar o stderr para o stdout. Conquistado pelo seguinte.

comando1 2 > & 1 | comando2

Protips: O motivo pelo qual o e comercial é necessário é porque você precisa dizer que está redirecionando stderr (2) para o descritor de arquivo stdout (1). Caso contrário, sem o e comercial, você está simplesmente dizendo ao stderr para redirecionar para o arquivo chamado '1' no diretório de trabalho atual. Semelhante ao que você pode fazer quando despejar a "saída" de um comando (stdout) em um arquivo via 'comando > myfile.log '. Colocar nenhum descritor de arquivo na frente do padrão de redirecionamento é 1 (stdout).

    
por 08.07.2011 / 01:52