Redirection temporaire de stderr dans un script bash
-
22-07-2019 - |
Question
J'ai un script simple qui est utilisé pour démarrer un autre programme. Cet autre programme peut parfois générer un SIGSEGV
, ce qui perturbe ma sortie. J'ai donc ajouté quelques lignes censées rediriger temporairement stderr
vers / dev / null
de sorte que le SIGSEGV
soit ignoré. Voici un brouillon de mon code:
exec 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>1
Le problème est que la dernière ligne ne fait pas ce que je veux. La première ligne fonctionne évidemment et redirige le stderr
. La dernière ligne est supposée renvoyer stderr
à son emplacement antérieur (ce qui, je l’ai supposé, est identique à stdout
).
Toute aide serait appréciée!
La solution
Une autre option est:
exec 3> /dev/stderr 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3
Ou même
exec 3>&2 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3
Ainsi, le script préserve la séparation entre stdout et stderr (les scripts stdout et stderr peuvent être redirigés séparément.
Autres conseils
Pourquoi ne pas simplement le rediriger uniquement pour l'exécution nom_programme?
progname > ./tmp/run.txt 2>/dev/null && run_status='OK'
Ou éventuellement
{
progname > ./tmp/run.txt && run_status='OK'
} 2>/dev/null