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 à 1Réponses:
Cette question est traitée dans BashFAQ / 032 . Dans votre exemple, vous devez:
La raison pour laquelle
ne se comporte pas comme vous l'attendez, car avec cette syntaxe, vous voudrez
time
la commandesleep 1 2>/dev/null
(oui, la commandesleep 1
avec stderr redirigée vers/dev/null
). Latime
fonction intégrée fonctionne de cette façon afin de rendre cela possible.Le
bash
builtin peut réellement faire cela parce que ... eh bien, c'est un builtin. Un tel comportement serait impossible avec la commande externetime
généralement située dans/usr/bin
. En effet:Maintenant, la réponse à votre question
est: il le fait, la sortie passe à stdout ou stderr .
J'espère que cela t'aides!
la source
exec 3>/some/file ; ls >&3 ;
)coproc
builtin. Mais ce n'est pas le cas pour letime
builtin.Votre question particulière au sujet
time
builtin a répondu, mais il sont des commandes qui n'écrivent pas non plus àstdout
oustderr
. Un exemple classique est la commande Unixcrypt
.crypt
sans argument crypte l'entrée standardstdin
et l'écrit dans la sortie standardstdout
. Il invite l'utilisateur à saisir un mot de passe à l'aidegetpass()
duquel, par défaut, une invite s'affiche/dev/tty
./dev/tty
est le terminal actuel. L'écriture dans/dev/tty
a pour effet d'écrire sur le terminal actuel (s'il y en a un, voirisatty()
).La raison pour laquelle il
crypt
est impossible d'écrire,stdout
c'est parce qu'il écrit une sortie chiffrée dansstdout
. En outre, il est préférable de demander à/dev/tty
au lieu d'écrire destderr
sorte que si un utilisateur redirigestdout
etstderr
, l'invite soit toujours visible. (Pour la même raison,crypt
impossible de lire le mot de passestdin
, car il est utilisé pour lire les données à chiffrer.)la source
time sleep 1 > /dev/null 2>&1
# redirige la sortie de "sleep" sur null. Ensuite, "time" écrit sa propre sortie, sans redirection. C'est comme "time (sleep 1 > /dev/null 2>&1)
".(time sleep 1) > /dev/null 2>&1
# exécute "time sleep 1", puis redirige sa sortie vers null.[] s
la source
Le problème dans votre cas est que la redirection fonctionne d'une autre manière. Tu as écrit
Cela redirige la sortie standard vers
/dev/null
, puis redirige l'erreur standard vers la sortie standard.Pour rediriger toutes les sorties, vous devez écrire
Ensuite, l'erreur standard sera redirigée vers la sortie standard et ensuite toutes les sorties standard (contenant l'erreur standard) seront redirigées vers
/dev/null
.la source
time
. Voir ma réponse pour quelques explications.