Considérez le nom de script suivant (légèrement idiot) 'test1.sh':
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
Quand je le lance, je reçois non seulement le résultat de l'écho, mais aussi le compte rendu par bash de la mort du sommeil sur stderr:
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
Dans ce cas, j'aimerais supprimer l’impression en stderr. Je sais que je peux le faire en ligne de commande, comme dans:
$ ./test1.sh 2> /dev/null
... mais est - il un moyen de le supprimer de l' intérieur du script? (Je sais que je pourrais l'envelopper dans un second script et le rediriger vers le wrapper, mais il doit y avoir quelque chose de plus facile ...)
bash
shell-script
stderr
intrépide
la source
la source
Réponses:
Vous avez raison; pkill ne génère pas le message, c'est bash. Vous suggérez que
est une solution possible. Comme le souligne UVV, l’action équivalente à partir du script est
Cela redirige le stderr du script à
/dev/null
partir de cette instruction jusqu'à ce qu'il soit modifié. Les moyens maladroits de le reconvertir incluentqui redirige stderr vers le terminal. C'est probablement (mais pas nécessairement) où il était à l'origine.
Ou
ce qui fait que stderr est identique à stdout et risque de se tromper.
Un moyen plus fiable est
qui enregistre le stderr d’origine dans le descripteur de fichier 3 et le restaure ultérieurement.
Parmi les autres moyens de supprimer l’annonce du décès, citons:
et
qui change le stderr uniquement pour les commandes groupées.
la source
stdin
etstderr
aux nouveaux descripteurs de fichier, à l'envoi des descripteurs d'origine/dev/null
puis à leur restauration?{ sleep 10 & pkill sleep;} 2> /dev/null
Selon cela, vous pourriez faire quelque chose comme suit:
la source