例如:我使用 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"