¿Por qué ‘java -version’ va a stderr?

¿Hay alguna razón especial para que los resultados de la java -version pasen a stderr ?

Por ejemplo, este comando ejecutado desde la línea de solicitud de Windows:

 java -version > java_version.txt 

deja el archivo java_version.txt vacío.

EDITAR: Lo mismo ocurre con la ayuda impresa después de ejecutar java.exe sin ningún parámetro.

EDITAR: Solo por pura curiosidad, verifiqué si siempre ha sido así y resultó que sí. java -version va a stderr en JDK 1.1.8 y también en JDK 1.2.2, sin embargo, las salidas de java.exe sin ningún parámetro no lo hacen.

¿Hay alguna razón especial para que los resultados de la versión java pasen a stderr?

AFAIK, no hay una razón especial. Es solo cómo se implementó / se implementó el comando java . Probablemente todo el camino de regreso a Java 1.0, aunque sería muy difícil verificarlo.

Mi breve investigación muestra que este comportamiento es inconsistente con la forma en que se comportan la mayoría de los comandos de Linux … todo lo demás que he probado usa stdout para la información de la versión. (Después de todo, la información de la versión no tiene salida de “error”).

Sin embargo, -version opciones de -version / -version son una convención más que algo requerido por cualquier norma formal. (Los estándares de encoding GNU establecen que los comandos deben implementar --version y que la información de la versión debe escribirse en la salida estándar. Pero los estándares POSIX no lo mencionan, ni tampoco los estándares LSB).


¿Qué puede / debe hacer?

  • Debería ser fácil capturar stderr en lugar de stdout en su script de shell o archivo por lotes.
  • No debería haber ningún riesgo al hacer esto. Oracle no puede cambiar las cadenas de herramientas de Java para enviar la salida de la -version a stdout sin romper potencialmente las secuencias de comandos del cliente. Esto es muy poco probable 1 .

1 – Aquí hay evidencia de lo poco probable que es: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4380614 . Tenga en cuenta la “Resolución: no arreglar” … y el comentario final.

La solución para este problema es:

 java -version 2> java_version.txt