не может получить конкретную строку из вывода bash - PullRequest
0 голосов
/ 11 ноября 2018

Я пробую простой скрипт 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 Ответ

0 голосов
/ 11 ноября 2018

Похоже, что ваш сценарий /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

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

...