java - ¿Cuál es el punto de System.err?
bash unix (2)
En UNIX, debo escribir un archivo Java que imprimirá "SALIDA 1" al error estándar y luego saldrá con un estado de 1
Aquí está mi enfoque ..
System.err.println("EXIT 1");
System.exit(1);
¿Es esto lo que se supone que debo hacer?
Si es así, ¿cómo se supone que lo use en las carcasas de Unix? Cuando lo compilo y lo ejecuto en el bash, simplemente imprime "SALIR 1" (por lo que hace lo mismo que System.out.println, ¿por qué debería usar "err"?). ¿Qué es el "error estándar" aquí?
Cada programa en ejecución tiene estos tres flujos:
- Entrada estándar (estándar), que normalmente proviene del teclado. Expuesto como
System.in
- Salida estándar (stdout), que normalmente va a la consola. Expuesto como
System.out
- Error estándar (stderr), que normalmente también va a la consola. Expuesto como
System.err
Su programa es correcto: se imprime en stderr. Pero en circunstancias normales, la secuencia stderr va a la consola al igual que la secuencia stdout, por lo que son visualmente indistinguibles.
Sin embargo, la razón por la que debe usar stderr en lugar de la salida estándar para los mensajes de error, es la redirección . Eso significa que envías stderr a un archivo en lugar de a la consola. Mientras tanto, stdout no se verá afectado, porque las dos secuencias son independientes.
Por ejemplo, puede hacer esto en bash, cmd, PowerShell, etc:
$ java Program 2> errors.txt
Ahora, toda la salida con System.err.println()
terminará en errors.txt
, mientras que System.out.println()
seguirá apareciendo en la pantalla. Esto puede ayudar con la depuración.
Hay tres flujos de datos asociados con casi todos los procesos:
- Entrada estándar: este es el flujo de entrada en un programa, ya sea desde un terminal, una consola, salida canalizada desde otro proceso o por algún otro medio.
- Error estándar: aquí es donde deben ir todos los mensajes de error y depuración. Esto es así para que este tipo de información pueda ser fácilmente capturada por separado de la salida regular de un programa. Los servidores web hacen esto, enviando mensajes de error a un archivo
error_log
través destderr
, mientras que el archivo de registro normal sería, por ejemplo,access_log
. - Salida estándar: Aquí es donde aparecen todas las salidas típicas y esperadas que un usuario que ejecuta un programa espera ver en pantalla.
La salida estándar ( stdout
) y el error estándar ( stderr
) son casi siempre el primer y el segundo flujo de salida provenientes de un proceso, respectivamente. Esto me permite hacer algo como /path/to/my/neat/program > logs/program.log 2> logs/program.err
y tener la salida y los errores ordenados.