En los scripts, los errores generalmente se envían al descriptor de archivo 2 con &2
, es decir:
echo "error" >&2
A veces /dev/stderr
se usa en su lugar:
echo "error" > /dev/stderr
Mirando /dev/stderr
, veo que es solo un enlace simbólico a /proc/self/fd/2
, que a su vez es un enlace simbólico a /dev/pts/5
(en mi terminal actual).
Parece un poco complicado. ¿Hay alguna lógica detrás de eso?
¿Está usando /dev/stderr
y &2
equivalente?
¿Alguno de los preferidos sobre el otro?
portability
stderr
Martin Vegter
fuente
fuente
echo "error" >2
crea un archivo con nombre2
y contenidoerror
.>2
o>&2
?Respuestas:
El dispositivo especial
/dev/stderr
es específico del sistema, mientras que el descriptor de archivo2
(no el dispositivo especial/proc/self/fd/2
) es portátil. Si desea escribir código no portátil, esos dispositivos especiales son un buen lugar para comenzar.Hay algunos sistemas con
/dev/stderr
: Linux, por supuesto, y OSX . Pero OSX no tiene un/proc
sistema de archivos, y/dev/stderr
es un enlace a/dev/fd/2
.Otras lecturas:
fuente
2> bla.log
que funcionaría mientras se canalice2
y no codifique/dev/stderr
. Básicamente2
no necesita ser lastderr
salida.En bash y otros shells, la forma de redirigir algo al error estándar es utilizarlo
>&2
. Bash se abre/dev/stderr
como el descriptor de archivo2
. Los descriptores de archivo están referenciados por&N
dóndeN
está el número del descriptor. Entonces,echo error >&2
imprimiráerror
al error estándar, a/dev/stderr
.También se abrirá
/dev/stdout
como descriptor de archivo1
. Esto significa que puedes hacerecho output >&1
. Sin embargo, dado que todo se imprime a la salida estándar de todos modos de forma predeterminada, es lo mismo queecho output
por sí solo.Ahora
2>
es diferente. Aquí, está redirigiendo la salida de error de un comando en otro lugar. Entonces,2>file
significa "redirigir todo lo impreso al descriptor de archivo 2 (error estándar) afile
".fuente
Tienes razón,
>&2
es más directo y perfectamente "idiomático". Deben ser equivalentes, por lo que no hay una razón particular para usar>/dev/stderr
. Excepto que, si alguien que lee no sabe lo que hacen, uno de ellos es probablemente más fácil de descubrir que el otro :-). Pero en general te sugiero que uses>&2
./ dev / stderr podría ser útil cuando los programas escriban errores en un nombre de archivo especificado, pero no admiten stderr. Claramente esto es un poco artificial; / dev / stdout es mucho más útil. (Recientemente descubrí que el
mysql_safe
script de envoltura no escribirá errores en la consola; desafortunadamente también quiere cambiar los permisos en el archivo de registro de errores, por lo que usar / dev / stderr causa algunas advertencias superfluas).fuente