我正在尝试简单的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
我在做什么错了?
答案 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
很高兴。