无法从 bash 输出中获取特定行

can't get specific line from bash output

我正在尝试简单的 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

我做错了什么?

您的脚本 /usr/libexec/java_home -V 正在将其部分或全部输出输出到 stderr,而不是写入到 stdout。由于 shell 管道 ('|') 将前一个命令的 stdout 连接到后一个命令的 stdin,任何输出到 stderr/usr/libexec/java_home -V 只是被写入您的屏幕,并且从未被 sed 处理,看起来 sed 没有工作。

要测试并纠正问题,只需将 stderr 从您的脚本重定向到 stdout,然后将结果通过管道传输到 sed,确保 [=19] =] 接收脚本的所有输出,例如

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

很高兴对您有所帮助。