Не может получить конкретную строку из вывода 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
Рад, что это помогло.