Почему, когда я делаю это: $ var=$(java -version) на моем терминале bash, var всегда пуст? То же самое с $ java -version >> version.txt ничего не отправляется в файл version.txt.

2 ответа2

3

Команда обычно отправляет такую информацию в STDERR, а не в STDOUT. Так что в вашем случае вы должны использовать такие команды, как:

java -version >>version.txt 2>&1

а также

var=$((java -version) 2>&1)
3

Как указал Ромео, java -version пишет в stderr, а не в stdout, поэтому вы должны использовать:

var=$(java -version 2>&1)

Если вы хотите получить только версию, а не весь вывод команды java -version , что более удобно для сценариев, например, вы можете использовать что-то вроде:

var=$(java -version 2>&1 | awk -F '"' 'NR==1 {print $2}')

объяснение

  1. java -version печатает сообщение о версии java в stderr
  2. 2>&1 перенаправляет stderr на стандартный вывод
  3. | принимает вывод команды левой рукой и использует его как ввод для команды правой руки
  4. awk -F '"' 'NR==1 {print $2}' немного сложнее, но в основном он делит входные данные, которые он получает, на части, что позволяет вам работать с каждой частью по отдельности (вероятно, наиболее осведомленные люди львы, это очень плохое резюме того, что есть и что делает awk).
    • Символ, который awk принимает для деления, указывается опцией -F , в этом случае он делится на символ "
    • Последняя часть указывает, что должен быть напечатан только второй элемент ({print $2}) из первой строки (NR==1) результирующего деления.

Это выведет что-то вроде 1.8.0_191 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .