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.000s
ou
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Pourquoi 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.sh
contenant cette commande:
$@ 2>&1
Ensuite, 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/null
signifie 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>&1
pour 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