(6 réponses)
Fermé il y a 6 ans.
Je souhaite empêcher mon programme d'envoyer stdout et stderr à des terminaux, fichiers ou périphériques. Pour cela, j'ai trois commandes qui me traversent l'esprit, mais je ne peux pas distinguer leurs différences. Pourriez-vous s'il vous plaît m'expliquer la signification de chacun d'eux s'il vous plaît.
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
Réponse acceptée :
# ./run > /dev/null
Cela redirige stdout vers /dev/null
, mais cela ne fait rien du tout avec stderr. Puisque vous avez demandé de rediriger depuis stdout et stderr, cela ne fait pas ce que vous voulez.
# ./run > /dev/null 1>&2
Cela redirige stdout vers /dev/null
, puis il redirige à nouveau stdout (1>
) à l'endroit où pointe stderr (&2
) qui est probablement le terminal et est probablement l'endroit où stdout pointait avant de le rediriger. Donc, l'effet net ici est (probablement) aucune redirection pour stdout, et comme pour stderr, vous ne faites toujours rien avec. Ce n'est donc pas non plus ce que vous voulez.
# ./run > /dev/null 2>&1
Cela redirige stdout vers /dev/null
, puis il redirige stderr (2>
) à l'endroit où pointe stdout, qui est /dev/null
parce que c'est là que vous venez de le rediriger. Cela semble être ce que vous voulez.
Je ne peux pas distinguer leurs différences.
En fait, vous devriez être capable de distinguer les différences assez facilement. Disons ./run
contient ceci :
#!/bin/sh
echo stdout
echo stderr >&2
Ensuite, les résultats devraient être les suivants :
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
La différence est nette !