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 ...)
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.
Selon this vous pouvez faire quelque chose comme ceci:
#!/bin/bash
exec 2>/dev/null
ls -al test