Pourquoi la sortie de certains programmes Linux ne va-t-elle ni à STDOUT ni à STDERR?
En fait, je veux savoir comment capturer de manière fiable toutes les sorties de programme, quel que soit le «flux» qu'il utilise. Le problème que j'ai, c'est que certains programmes ne semblent pas permettre de capturer leur sortie.
Un exemple est la commande «time»:
time sleep 1 2>&1 > /dev/null
real        0m1.003s
user        0m0.000s
sys         0m0.000sou
time sleep 1 &> /dev/null
real        0m1.003s
user        0m0.000s
sys         0m0.000sPourquoi est-ce que je vois la sortie les deux fois? Je m'attendais à ce que tout soit canalisé dans / dev / null .
Quel flux de sortie le temps utilise-t-il et comment le canaliser dans un fichier?
Une façon de contourner le problème consiste à créer un script Bash , par exemple, combine.shcontenant cette commande:
$@ 2>&1Ensuite, la sortie du «temps» peut être capturée de la bonne manière:
combine.sh time sleep 1 &> /dev/null(aucune sortie n'est vue - correcte)
Existe-t-il un moyen de réaliser ce que je veux sans utiliser un script de combinaison distinct?
2>&1 > /dev/nullsignifie que "2 va maintenant à l'endroit où va 1 (c'est-à-dire, le terminal, par défaut), puis 1 va maintenant à / dev / null (mais 2 va toujours au terminal!). utiliser>/dev/null 2>&1pour dire "1 va maintenant à / dev / null, puis 2 va là où 1 va (c'est-à-dire aussi à / dev / null). Cela ne fonctionnera toujours pas ici car le temps intégré ne sera pas redirigé, mais est plus généralement correct (par exemple, cela fonctionnerait si vous utilisez / usr / bin / time). Pensez à "2> & 1" comme copiant la "direction" de 1 en 2, pas comme 2 allant à 1