无法在我的命令中重定向错误消息

时间:2018-04-28 00:03:08

标签: linux bash shell

我是bash脚本的新手,这里基本上是我的bash脚本:

Z=`diff -Z $ref_out $exec_out | grep "[<>]" | wc -l` 2>/dev/null
if [ $Z -gt 0 ]; then
echo "*** testcase: [ stdout - FAILED ]"
else
echo "*** testcase: [ stdout - PASSED ]"
fi

我想从diff中删除错误消息,例如:

diff: No such file or directory

这可能是因为没有$ ref_out或$ exec_out文件,但是我重定向到/ dev / null,这个错误信息仍然显示出来。 有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

你需要diff的stderr转到/ dev / null,所以它应该是:

Z=`diff -Z $ref_out $exec_out 2> /dev/null | grep "[<>]" | wc -l`

答案 1 :(得分:0)

您的重定向不起作用,因为它正在应用于父shell,而不是运行管道的子shell。

如果你想将一堆命令的stderr发送到/ dev / null,你可以这样做 - 我使用的是$()而不是backticks

Z=$( { diff -Z $ref_out $exec_out | grep "[<>]" | wc -l; } 2>/dev/null )

此处,2>/dev/null适用于{ }内的所有命令。

您的代码中存在许多问题。你可以用更好的方式重写它:

if diff -Z "$ref_out" "$exec_out" 2>/dev/null | grep -q "[<>]"; then
  echo "*** testcase: [ stdout - FAILED ]"
else
  echo "*** testcase: [ stdout - PASSED ]"
fi
  • grep -q是进行此项检查的更好方式,除非您想知道匹配的确切数量,否则您不会需要wc -l
  • 您需要引用变量
  • if语句可以包含命令;您不需要捕获输出以便在if语句中使用它

您可以使用shellcheck验证您的shell脚本,看看您是否犯了可能导致代码破坏的常见错误。