【发布时间】:2016-09-04 17:58:44
【问题描述】:
我有一个这样的脚本:
#!/bin/sh
echo "hello"
echo "goodbye"
exit 1
当我自己运行它时,我得到了失败的退出代码。
$ ./fail.sh
hello
goodbye
$ echo $?
1
但是,当我通过grep -v 运行它时,退出状态变为成功:
$ ./fail.sh | grep -v hello
goodbye
$ echo $?
0
有没有办法将命令的输出通过管道传输到grep -v 并且仍然可以正确传播状态代码?当然,在现实世界中,这样做的目的是过滤嘈杂命令的输出,同时仍然检测命令是否失败。
【问题讨论】:
-
不知道你是否可以直接这样做,但你总是可以将输出重定向到一个 tmp 文件,它允许你获取初始 grep 的返回,然后将你的第二个 grep 应用于输出文件内容。
-
limp_chimp 您有机会测试@hek2mgl 或我为您发布的建议吗?如果它对您有用,请务必发布反馈并考虑接受答案。
-
不知道为什么错过了这个,但
grep -v是一个用于此示例的非常糟糕的命令。这是因为尽管grep遵循关于退出状态的约定,但grep -v不一定。换句话说,使用-v会反转匹配但not 退出代码。我的经验是grep -v在返回不匹配时返回成功。如果没有不匹配返回它返回失败。如果没有匹配项,则返回所有不匹配的行并成功。 -
^ 使用
grep (GNU grep) 2.24(Copyright (C) 2016 Free Software Foundation, Inc.),这里是citation