无法从 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
很高兴对您有所帮助。
我正在尝试简单的 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
很高兴对您有所帮助。