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?
                    
                        portability
                                stderr
                                
                    
                    
                        Martin Vegter
fuente
                
                fuente

echo "error" >2crea un archivo con nombre2y contenidoerror.>2o>&2?Respuestas:
El dispositivo especial
/dev/stderres 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/procsistema de archivos, y/dev/stderres un enlace a/dev/fd/2.Otras lecturas:
fuente
2> bla.logque funcionaría mientras se canalice2y no codifique/dev/stderr. Básicamente2no necesita ser lastderrsalida.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 archivo2. Los descriptores de archivo están referenciados por&NdóndeNestá el número del descriptor. Entonces,echo error >&2imprimiráerroral error estándar, a/dev/stderr.También se abrirá
/dev/stdoutcomo 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 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) afile".fuente
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).fuente