CentOS 5.3, Perl, comandos bash, ocultar TODAS as saídas para a tela

2

Estou executando o seguinte comando:

[user@server ~]$ /usr/sbin/ntpdate -d IPREMOVEDFORSECURITY | egrep 'transmit timestamp' | tail -1 | awk '{print $4, $5, $6, $7, $8}'
host found : HOSTREMOVEDFORSECURITY
Tue, Feb 15 2011 12:38:38.321

Portanto, o problema é que sempre recebo a linha "host found:", independentemente do tipo de redirecionamento que eu uso. Eu tentei o seguinte:

0>/dev/null
1>/dev/null
2>/dev/null
2>&1
2>&/dev/null

E todas as outras variações em que posso pensar, ou consegui encontrar online. Tudo o que preciso e quero que seja retornado é a segunda linha (timestamp) dessa saída de comando. Eu não entendo porque eu não consigo afetar a linha "host found:"?!?!

Estou executando esses comandos pelo perl, mas vejo o mesmo comportamento ao executá-los diretamente no bash. Eu preciso suprimir esse host: linha porque no perl, eu estou executando o comando usando backticks para atribuir a saída a uma variável e saída de uma resposta limpa com base em algumas outras condicionais. Não importa o que, essa linha de host mostra e confunde a saída do meu script, embora isso não afete o que realmente está atribuído à variável.

Minha suposição aqui é que essa linha não está usando os encadeamentos STDIN, STDOUT, STDERR normais, mas não consigo localizar nenhuma informação específica em um método de saída 4. Todos os sites que encontrei falam apenas sobre esses três.

Se alguém tiver a resposta para isso, por favor, por favor, por favor me avise!

PS: este não é o único comando que mostra esse comportamento, o chkconfig e alguns outros também fazem isso, e eu realmente gostaria de descobrir como suprimir essa saída desnecessária.

    
por Garrett 15.02.2011 / 20:59

1 resposta

6

O ntpdate está imprimindo o 'host encontrado' para o stderr e todo o restante para o stdout. Isso redirecionará tudo para o stdout:

/usr/sbin/ntpdate -d localhost 2>&1 | egrep 'transmit timestamp' 2>/dev/null | \
tail -1 | awk '{print $4, $5, $6, $7, $8}'

e, em seguida, o egrep remove a linha 'host found', pois não corresponde.

Eu acho que sua confusão provavelmente vem de colocar o redirecionamento no final do pipeline, em vez de dentro do pipeline. você tem que encontrar o comando que está imprimindo os dados extras para stderr (neste caso, ntpdate) e redirecionar ou suprimir o stderr nesse ponto, antes o restante do pipeline é executado.

    
por 15.02.2011 / 21:11