Considere o seguinte nome de script (um pouco bobo) 'test1.sh':
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
Quando o executo, recebo não apenas a saída do eco, mas também o relatório do bash sobre a morte do sono no stderr:
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
Nesse caso, eu gostaria de suprimir a impressão em 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 poderia envolvê-lo em um segundo script e fazer com que o wrapper o redirecionasse, mas deve haver algo mais fácil ...)
bash
shell-script
stderr
fearless_fool
fonte
fonte
Respostas:
Você está certo; pkill não está gerando a mensagem, o bash é. Você sugere que
é uma solução possível. Como UVV aponta, a ação equivalente de dentro do script é
Isso redireciona o stderr para o script
/dev/null
dessa declaração até que seja alterado novamente. Desajeitadas maneiras de mudar de volta incluemque redireciona o stderr para o terminal. É provavelmente (mas não necessariamente) onde estava originalmente.
Ou
que define stderr como igual a stdout e provavelmente está errado.
Uma maneira mais confiável é
que salva o stderr original no descritor de arquivo 3 e depois o restaura.
Outras maneiras de suprimir apenas o anúncio da morte do processo incluem
e
que alteram o stderr apenas para os comandos agrupados.
fonte
stdin
estderr
aos novos descritores de arquivo, enviando os descritores originais para/dev/null
e depois restaurá-los?{ sleep 10 & pkill sleep;} 2> /dev/null
De acordo com isso, você pode fazer algo como o seguinte:
fonte