我有多个管道命令,如下所示:
find [options] | grep [options] | xargs grep [options]
它们中的每一个都可能产生我不感兴趣的错误(权限错误,文件中空间错误等)。所以,我想将所有错误重定向到/ dev / null。我知道我可以使用2>/dev/null
,为每个命令执行此操作。我可以持久设置IO重定向吗?理想情况下,我只需在命令的开头/结尾设置一次,然后它将影响所有后续/前面的管道命令。此外,是否可以永久设置IO重定向,以便在重置之前它继续影响所有命令?
我正在使用bash(我检查了bash builtins的手册页,并没有在顶部看到'&gt;'和'&lt;'字符,所以我认为它是linux的东西......对不起)< / p>
答案 0 :(得分:7)
我将假设您正在使用bash,或者至少使用类似Bourne的shell。
我还假设您要避免的是以下内容:
find ... 2>/dev/null | grep ... 2>/dev/null | xargs ... 2>/dev/null
即。为管道的每个段重复2>/dev/null
部分。
你可以这样做:
( find ... | grep ... | xargs ... ) 2>/dev/null
您还可以按如下方式永久设置重定向:
exec 2>/dev/null
和(假设STDOUT和STDERR之前都指向同一个地方),您可以通过以下方式撤消:
exec 2>&1
答案 1 :(得分:0)
使用重定向的stderr启动一个新shell,然后在那里运行管道?
像
这样的东西$ bash 2>/dev/null -c "find [options] | grep [options] | xargs grep [options]"
当我这样做时似乎有效(即没有可见的输出)
$ bash 2>/dev/null -c "echo nope 1>&2"
当然,一个副作用是,如果发生任何意外情况,发现发生了什么事情会很棘手,但那是你的事。