web-dev-qa-db-fra.com

supprimer les messages stderr dans un script bash

Considérez le nom de script suivant (légèrement idiot) "test1.sh":

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

Quand je l'exécute, j'obtiens non seulement la sortie de l'écho, mais le rapport de bash de la mort du sommeil sur stderr:

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

Dans ce cas, je voudrais supprimer l'impression sur stderr. Je sais que je peux le faire sur la ligne de commande, comme dans:

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

... mais existe-t-il un moyen de le supprimer de dans le script? (Je sais que je pourrais l'envelopper dans un deuxième script et que le wrapper le redirige, mais il doit y avoir quelque chose de plus facile ...)

52
fearless_fool

Tu as raison; pkill ne génère pas le message, bash l'est. Vous suggérez que

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

est une solution possible. Comme le souligne UVV, l'action équivalente à partir du script est

exec 2> /dev/null

Cela redirige le stderr du script vers /dev/null à partir de cette instruction jusqu'à ce qu'elle soit modifiée. Les moyens maladroits de le changer en arrière incluent

exec 2> /dev/tty

qui redirige stderr vers le terminal. C'est probablement (mais pas nécessairement) où il était à l'origine.

Ou

exec 2>&1

qui définit stderr pour être le même que stdout, et est probablement faux.

Un moyen plus fiable est

exec 3> & 2 
 exec 2> /dev/null
(faites des trucs où vous ne voulez pas voir le stderr.)
 exec 2> & 3

qui enregistre le stderr d'origine dans le descripteur de fichier 3, puis le restaure.

D'autres moyens de supprimer simplement l'annonce de la mort du processus comprennent

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

et

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

qui changent le stderr pour seulement les commandes groupées.

82
Scott

Selon this vous pouvez faire quelque chose comme ceci:

#!/bin/bash
exec 2>/dev/null
ls -al test
11
UVV