Не может получить конкретную строку из вывода bash

Я пытаюсь простой bash скрипт:

/usr/libexec/java_home -V

вывод:

Matching Java Virtual Machines (3):
11.0.1, x86_64: "Java SE 11.0.1"    /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
10.0.1, x86_64: "Java SE 10.0.1"    /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
1.8.0_192, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home

Кажется, что 4 строки, но если я попытаюсь получить вторую строку:

/usr/libexec/java_home -V | sed -n 2p

Выход такой же. Нет дополнительной строки. Если я попробую первый - я получу второй:

/usr/libexec/java_home -V | sed -n 1p

Выход:

Matching Java Virtual Machines (3):
    11.0.1, x86_64: "Java SE 11.0.1"    /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
    10.0.1, x86_64: "Java SE 10.0.1"    /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
    1.8.0_192, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home

Если я назначу вывод массиву и посчитаем его размер:

array=( $(/usr/libexec/java_home -V) )
array_size=${#array[@]}
echo $array_size

это показывает размер = 1:

Matching Java Virtual Machines (3):
    11.0.1, x86_64: "Java SE 11.0.1"    /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
    10.0.1, x86_64: "Java SE 10.0.1"    /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
    1.8.0_192, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home

1

Что я делаю неправильно?

1 ответ

Решение

Похоже, что ваш сценарий, /usr/libexec/java_home -V выводит часть или все свои выходные данные в stderr вместо того, чтобы писать stdout, Так как оболочка трубы ('|') соединяет stdout предыдущей команды stdin команды, которая следует, любой вывод stderr от /usr/libexec/java_home -V просто записывается на ваш экран и никогда не обрабатывается sed чтобы это выглядело как sed не работал

Чтобы проверить и исправить проблему, это так, просто перенаправить stderr от вашего сценария до stdout а затем передать результат в sed, убедиться sed получает весь вывод из вашего скрипта, например

$ /usr/libexec/java_home -V 2>&1 | sed -n 1p

Рад, что это помогло.

Другие вопросы по тегам