enviando salida a / dev / stderr vs.> & 2


11

En los scripts, los errores generalmente se envían al descriptor de archivo 2 con &2, es decir:

echo "error" >&2

A veces /dev/stderrse 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/stderry &2equivalente?

¿Alguno de los preferidos sobre el otro?


3
echo "error" >2crea un archivo con nombre 2y contenido error.
Cyrus


Veo mi edición reintroducida & 2 en lugar de 2. ¿Es su pregunta realmente sobre el uso de >2o >&2?
Jeff Schaller

Respuestas:


13

El dispositivo especial /dev/stderres específico del sistema, mientras que el descriptor de archivo 2(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 /procsistema de archivos, y /dev/stderres un enlace a /dev/fd/2.

Otras lecturas:


También está el caso donde alguien quiere hacer, por ejemplo. esto 2> bla.logque funcionaría mientras se canalice 2y no codifique /dev/stderr. Básicamente 2no necesita ser la stderrsalida.
larkey

6

En bash y otros shells, la forma de redirigir algo al error estándar es utilizarlo >&2. Bash se abre /dev/stderrcomo el descriptor de archivo 2 . Los descriptores de archivo están referenciados por &Ndónde Nestá el número del descriptor. Entonces, echo error >&2imprimirá erroral error estándar, a /dev/stderr.

También se abrirá /dev/stdoutcomo descriptor de archivo 1. Esto significa que puedes hacer echo output >&1. Sin embargo, dado que todo se imprime a la salida estándar de todos modos de forma predeterminada, es lo mismo que echo outputpor sí solo.

Ahora 2>es diferente. Aquí, está redirigiendo la salida de error de un comando en otro lugar. Entonces, 2>filesignifica "redirigir todo lo impreso al descriptor de archivo 2 (error estándar) a file".


3

Tienes razón, >&2es 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_safescript 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).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.