suprime as mensagens stderr em um script bash

33

Considere o seguinte nome de script (um pouco bobo) 'test1.sh':

#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep

Quando eu o executo, recebo não apenas a saída do eco, mas o relato de bash sobre a morte do sono no stderr:

$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5:  3551 Terminated              sleep 10

Neste caso, gostaria de suprimir a impressão para stderr. Eu sei que posso fazer isso na linha de comando, como em:

$ ./test1.sh 2> /dev/null

... mas existe uma maneira de suprimi-lo de dentro do script? (Eu sei que eu poderia envolvê-lo em um segundo script e ter o wrapper redirecionando-o, mas deve haver algo mais fácil ...)

    
por fearless_fool 14.02.2015 / 07:16

2 respostas

53

Você está certo; pkill não está gerando a mensagem, bash é. Você sugere que

$ ./test1.sh 2> /dev/null

é uma solução possível. Como o UVV aponta, a ação equivalente de dentro do script é

exec 2> /dev/null

Isso redireciona o stderr para o script para /dev/null desta declaração até que ela seja alterada novamente. Maneiras desajeitadas de alterá-lo incluem

exec 2> /dev/tty

que redireciona o stderr para o terminal. Isso é provavelmente (mas não necessariamente) onde foi originalmente.

Ou

exec 2>&1

que define stderr para ser o mesmo que stdout, e é provável que esteja errado.

Uma maneira mais confiável é

exec 3>&2
exec 2> /dev/null
(do stuff where you don't want to see the stderr.)
exec 2>&3

que salva o stderr original no descritor de arquivo 3 e depois o restaura.

Outras formas de suprimir apenas o anúncio da morte do processo incluem

(sleep 10 & pkill sleep) 2> /dev/null

e

{ sleep 10 & pkill sleep;} 2> /dev/null

que mudam o stderr apenas para os comandos agrupados.

    
por 14.02.2015 / 09:19
5

De acordo com este você poderia fazer algo como seguir:

#!/bin/bash
exec 2>/dev/null
ls -al test
    
por 14.02.2015 / 08:57