Java-версия не пишет в стандартный вывод?

1505
Juan Delgado

Либо я делаю что-то глупое, либо Солнце есть. Как получилось что-то вроде:

java -version > version.txt 

Все еще выводит на stdout и оставляет version.txt пустым? Я проверяю код завершения, и он по-прежнему равен 0, поэтому он не пишет в stderr.

Мне это нужно, потому что я создаю инструмент для тестовой среды и хочу проверить, адекватна ли версия Java, я планировал получить выходные данные этой версии, но теперь я застрял.

Я на OS X Leopard, Java версии 1.6.0_20.

Есть идеи?

2

3 ответа на вопрос

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

Код выхода не имеет никакого отношения к тому, где он выводит.

Не могли бы вы объяснить `&` или хотя бы сказать, как это называется? Это действительно трудно найти в Google. Dan Rosenstark 13 лет назад 0
Хорошо, это работает. Хотите объяснить разницу между тем, что я делал, и добавлением &? Спасибо : ) Juan Delgado 13 лет назад 0
`>` только перенаправляет стандартный вывод. `&>` перенаправляет как stdout, так и stderr в большинстве оболочек. Ignacio Vazquez-Abrams 13 лет назад 0
Thanks, there is also this `2>&1`. Is that the same as `&` in most cases? Dan Rosenstark 13 лет назад 0
@Yar: As far as I know, the 2>&1 form is for Windows. Ash 13 лет назад 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 13 лет назад 2
@gawity, спасибо за это. То есть вы говорите, что ответ Игнасио будет работать только на Баш? Dan Rosenstark 13 лет назад 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 13 лет назад 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 13 лет назад 0
9
Arjan

Это своего рода особенность в наше время. ;-)

Из древнего сообщения об ошибке :

Мы должны очень, очень тщательно подумать, прежде чем исправлять эту ошибку. Очевидно, неправильно выводить информацию о версии в stderr, но, поскольку мы занимаемся этим с самого начала, представляется вероятным, что мы сломаем существующие системы, построенные на основе Java, если мы изменим их сейчас. Если мы решим изменить это, то он должен дождаться выпуска Tiger, чтобы можно было провести адекватное тестирование.

ХА! Как насчет этого:) Спасибо за ссылку на ошибку, вроде заставляет меня чувствовать себя лучше. Juan Delgado 13 лет назад 0
1
sleske

Так же, как дополнение к ответу Игнасио:

Синтаксический анализ выходных данных java -versionдовольно сложен и подвержен ошибкам (и не всегда гарантируется, что выходные данные будут иметь одинаковый формат, особенно с JVM, не относящимися к Sun).

Чтобы проверить версию Java, вы можете запустить небольшую программу Java, которая проверяет соответствующие системные свойства: см. Javadocs для getProperties () . Это официальный, документированный способ получения информации о среде Java. Вы, вероятно, хотите проверить:

  • java.version (точный номер версии установки Java, например, 1.6.0_15)
  • java.specification.version (версия платформы Java, например, 1.5 или 1.6)