我正在运行一个抛出异常的java程序。我正在将run的输出传递给grep命令,我在这里检查一个不存在的模式,但grep会一直返回匹配。
commit --amend
我正在运行以下命令:
0,2,468.000000
1,2,305.000000
2,5,2702.000000
3,3,1672.000000
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at TestConverter.processPayments(TestConverter.java:113)
at TestConverter.processFile(TestConverter.java:131)
at TestConverter.main(TestConverter.java:142)
我得到以下输出:
java -classpath TestConverter.jar TestConverter test_xml.xml | grep "stringthatdoesnotmatch*"
我不确定为什么会这样。此外,我的最终目标是检查输出是否包含以下模式:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at TestConverter.processPayments(TestConverter.java:113)
at TestConverter.processFile(TestConverter.java:131)
at TestConverter.main(TestConverter.java:142)
答案 0 :(得分:2)
您实际上不获得匹配。您必须了解的是标准输出与标准错误之间的区别。
Java程序正在将其正常输出写入前者,后者是例外,但两者这些流最初都附加到终端设备。
因此,当您添加管道时:
program | grep xyzzy
|
字符会将program
的标准输出转移到grep
的标准输入。然后,这将过滤掉任何不包含xyzzy
的行,并将其余行传递给其标准输出,在这种情况下为终端。
program
的标准错误仍然直接连接到终端,因此无论grep
做什么,都会显示在那里。
如果您希望grep
程序捕获`程序的输出和错误,请先将它们合并:
program 2>&1 | grep xyzzy
2>&1
表示获取目标为流2的内容(标准错误),而是将其发送到流1(标准输出)。然后,|
可以接收来自program
的输出/错误的所有。