【发布时间】:2019-04-14 03:23:19
【问题描述】:
我正在尝试简单的 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
我做错了什么?
【问题讨论】:
-
可能输出到
stderr而不是stdout,尝试/usr/libexec/java_home -V 2>&1 | sed -n 1p可能"Matching Java.."是到stdout,其余到stderr。 (很难说)。您始终可以使用/usr/libexec/java_home -V 2>/dev/null来消除输出到stderr进行测试的内容。如果都是stdout,那么有一些东西会阻止正常的分词发生。您是否在父 shell 中更改了IFS? -
/usr/libexec/java_home -V 2>&1 | sed -n 1p很好用!谢谢! -
当然,很高兴它有帮助。您的
sed调用是正确的,因此唯一可能的其他原因是脚本正在输出到stderr(它没有被传送到sed并且只是出现在您的屏幕上,使它看起来像sed不是在职的)。现在你知道当类似的事情出现时要寻找什么——我们都以同样的方式吸取了教训:)
标签: bash stdout stderr io-redirection