Dans les scripts, les erreurs sont généralement envoyées au descripteur de fichier 2 avec &2
, c'est-à-dire:
echo "error" >&2
Parfois /dev/stderr
est utilisé à la place:
echo "error" > /dev/stderr
En regardant /dev/stderr
, je vois que ce n'est qu'un lien symbolique vers /proc/self/fd/2
, qui à son tour est un lien symbolique vers /dev/pts/5
(sur mon terminal actuel).
Semble un peu trop compliqué. Y a-t-il une logique derrière cela?
Utilise /dev/stderr
et est &2
équivalent?
Est-ce que l'un d'entre eux est préféré à l'autre?
portability
stderr
Martin Vegter
la source
la source
echo "error" >2
crée un fichier avec nom2
et contenuerror
.>2
, ou>&2
?Réponses:
Le périphérique spécial
/dev/stderr
est spécifique au système, tandis que le descripteur de fichier2
(et non le périphérique spécial/proc/self/fd/2
) est portable. Si vous souhaitez écrire du code non portable, ces appareils spéciaux sont un bon point de départ.Il y a quelques systèmes avec
/dev/stderr
: Linux, bien sûr, et OSX . Mais OSX n'a pas de/proc
système de fichiers, et/dev/stderr
c'est un lien vers/dev/fd/2
.Lectures complémentaires:
la source
2> bla.log
qui fonctionnerait aussi longtemps que vous dirigez vers2
et non du code dur/dev/stderr
. Fondamentalement, il2
n'a pas besoin d'être lastderr
sortie.Dans bash, et d'autres shells, la façon de rediriger quelque chose vers l'erreur standard est d'utiliser
>&2
. Bash s'ouvre en/dev/stderr
tant que descripteur de fichier2
. Les descripteurs de fichiers sont référencés par&N
oùN
est le numéro du descripteur. Donc,echo error >&2
imprimeraerror
à l'erreur standard, à/dev/stderr
.Il s'ouvrira également
/dev/stdout
comme descripteur de fichier1
. Cela signifie que vous pouvez le faireecho output >&1
. Cependant, comme tout est imprimé sur la sortie standard de toute façon par défaut, c'est la même chose queecho output
par lui-même.Maintenant,
2>
c'est différent. Ici, vous redirigez la sortie d'erreur d'une commande ailleurs. Donc,2>file
signifie "rediriger tout ce qui est imprimé vers le descripteur de fichier 2 (erreur standard) versfile
".la source
Tu as raison,
>&2
c'est plus direct et parfaitement "idiomatique". Ils doivent être équivalents, il n'y a donc aucune raison particulière de les utiliser>/dev/stderr
. Sauf que si quelqu'un qui lit ne sait pas ce que cela fait, l'un d'eux est probablement plus facile à découvrir que l'autre :-). Mais en général, je vous suggère d'utiliser>&2
./ dev / stderr peut être utile lorsque les programmes écrivent des erreurs dans un nom de fichier spécifié, mais ne prennent pas en charge stderr. De toute évidence, c'est un peu artificiel; / dev / stdout est beaucoup plus utile. (J'ai récemment trouvé que le
mysql_safe
script wrapper n'écrirait pas d'erreurs sur la console; malheureusement, il souhaite également modifier les autorisations sur le fichier journal des erreurs, donc l'utilisation de / dev / stderr provoque quelques avertissements superflus).la source