Java-Version schreibt nicht in stdout?

1586
Juan Delgado

Entweder mache ich etwas Dummes oder Sun ist es. Wie kommt so etwas wie:

java -version > version.txt 

Wird noch in stdout ausgegeben und version.txt leer gelassen? Ich checke den Exit-Code aus, und es ist immer noch 0, also schreibt Stderr nicht.

Ich brauche das, weil ich ein Testumgebungstool baue und überprüfen möchte, ob die Version von Java ausreichend ist. Ich hatte vor, diese Version der Version zu erfassen, aber jetzt bin ich festgefahren.

Ich bin auf OS X Leopard, Java Version 1.6.0_20.

Irgendwelche Ideen?

2

3 Antworten auf die Frage

9
Ignacio Vazquez-Abrams
java -version &> version.txt 

Der Exit-Code hat nichts damit zu tun, wo er ausgegeben wird.

Könnten Sie bitte das "&" erklären oder zumindest sagen, wie es heißt? Es ist wirklich schwer in Google zu suchen. Dan Rosenstark vor 13 Jahren 0
Nizza, es funktioniert. Möchten Sie den Unterschied zwischen dem, was ich getan habe, und dem Hinzufügen von & erklären? Vielen Dank : ) Juan Delgado vor 13 Jahren 0
`>` alleine leitet nur stdout um. `&>` leitet stdout und stderr in den meisten Shells um. Ignacio Vazquez-Abrams vor 13 Jahren 0
Thanks, there is also this `2>&1`. Is that the same as `&` in most cases? Dan Rosenstark vor 13 Jahren 0
@Yar: As far as I know, the 2>&1 form is for Windows. Ash vor 13 Jahren 0
@Ash: **`2>&1` is the same in POSIX-compatible shells** (`bash`, `zsh`, `ash`). The syntax is `x>&y` where `x` and `y` are file descriptors (`1` for stdout, `2` for stderr). Only `>&` and `&>` are `bash`-specific extensions (which both mean `1>somefile 2>&1`) grawity vor 13 Jahren 2
@gawity, danke dafür. Sie sagen also, dass Ignacios Antwort nur bei Bash funktioniert? Dan Rosenstark vor 13 Jahren 0
@Yar, `&>` is a non-standard extension. Both *bash* and *zsh* know it though. Bare `>&` (no numbers) is also non-standard, but also both *bash* and *zsh* know it. All Bourne-like shells (including POSIX conforming shells) know `x>&y`. Chris Johnsen vor 13 Jahren 1
Redirections such as `[fd]>file`, `[fd]>>file`, `[fd]&fd` work in both POSIX-compatible shells **and** `cmd.exe`. Thus **`>somefile 2>&1` will always work**. On the other hand, bare `>& somefile` is a bashism. _(Adding to my previous comment)_ grawity vor 13 Jahren 0
9
Arjan

Es ist heutzutage eine Art Funktion. ;-)

Aus einem alten Fehlerbericht :

Wir sollten sehr genau überlegen, bevor wir diesen Fehler beheben. Es ist offensichtlich falsch, Versionsinformationen an stderr zu drucken, aber da wir dies seit Beginn der Zeit tun, ist es wahrscheinlich, dass wir bestehende Systeme, die auf Java basieren, brechen, wenn wir sie jetzt ändern. Wenn wir uns entschließen, dies zu ändern, muss es bis zur Veröffentlichung des Tigers warten, damit angemessene Tests durchgeführt werden können.

HA! Was ist damit:) Danke für den Link zum Fehler, irgendwie fühle ich mich besser. Juan Delgado vor 13 Jahren 0
1
sleske

Nur als Ergänzung zu Ignacios Antwort:

Das Parsing der Ausgabe von java -versionist ziemlich komplex und fehleranfällig (und es ist nicht garantiert, dass die Ausgabe immer dasselbe Format hat, insbesondere bei Nicht-Sun-JVMs).

Um die Java-Version zu überprüfen, können Sie ein kleines Java-Programm ausführen, das die entsprechenden Systemeigenschaften überprüft: Siehe Javadocs für getProperties () . Dies ist der offizielle, dokumentierte Weg, um Informationen über die Java-Umgebung zu erhalten. Sie möchten wahrscheinlich prüfen:

  • java.version (genaue Versionsnummer der Java-Installation, zB 1.6.0_15)
  • java.specification.version (die Java-Plattformversion, zB 1.5 oder 1.6)