如何在管道中抑制 tar 错误消息

如何在管道中抑制 tar 错误消息

例如:我使用 tar -xvf 而不是 tar -xjvf 来提取 tar.bz2 文件:

 tar -xvf file.tar.bz2
 tar: invalid tar magic

如果重定向 stderr

 tar -xvf file.tar.bz2 2>/dev/null

有用。

现在如果我使用管道

 tar -xvf file.tar.bz2 | grep "something" 2>/dev/null 
 tar: invalid tar magic

如果第一个命令失败,我就无法抑制错误。

有没有办法通过这种方式抑制

答案1

以下是涉及重定向tar和的 STDERR 的几种替代方法grep

  • 使用bash命令分组{}

    { tar -xvf file.tar.bz2 | grep "something" ;} 2>/dev/null
    
  • 使用子shell ()

    ( tar -xvf file.tar.bz2 | grep "something" ) 2>/dev/null
    

请注意,如果你想重定向单个进程的 STDERR,最好使用Oli 的回答反而。

另一方面,如果您想grep通过 STDOUT 和 STDERR 进行某些操作tar

tar -xvf file.tar.bz2 |& grep "something"

这也将导致的 STDERRtar耗尽。

这实际上是以下的简写:

tar -xvf file.tar.bz2 2>&1 | grep "something"

答案2

管道在命令中形成一个单独的子句,因此重定向......

tar -xvf file.tar.bz2 | grep "something" 2>/dev/null 

...正在将 STDERR 从 重定向grep,而不是tar

要修复它,只需重新排序,以便您的重定向符合您的tar命令:

tar -xvf file.tar.bz2 2>/dev/null | grep "something"

相关内容