无法从bash输出获取特定行

时间:2018-11-11 00:10:24

标签: bash stdout stderr io-redirection

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

很高兴。