bash - 重定向覆盖 - 如何管道stderr,而不是标准输出?




stderr重定向 (6)

我有一个将信息写入stdoutstderr ,而我需要grep通过stderr的内容 ,而忽略标准输出

我当然可以分两步来做:

command > /dev/null 2> temp.file
grep 'something' temp.file

但我宁愿能够在没有临时文件的情况下执行此操作。 有没有智能管道技巧?



在Bash中,你也可以使用进程替换重定向到一个子shell:

command > >(stdlog pipe)  2> >(stderr pipe)

对于手头的情况:

command 2> >(grep 'something') >/dev/null

对于那些希望将stdout和stderr永久重定向到文件的人,grep on stderr,但保留stdout将消息写入到tty:

# save tty-stdout to fd 3
exec 3>&1
# switch stdout and stderr, grep (-v) stderr for nasty messages and append to files
exec 2> >(grep -v "nasty_msg" >> std.err) >> std.out
# goes to the std.out
echo "my first message" >&1
# goes to the std.err
echo "a error message" >&2
# goes nowhere
echo "this nasty_msg won't appear anywhere" >&2
# goes to the tty
echo "a message on the terminal" >&3

我尝试跟随,找到它的工作,

command 1> /dev/null | grep 'something'

结合最好的答案,如果你这样做:

command 2> >(grep -v something 1>&2)

...然后所有的stdout被保存为stdout 所有的stderr被保存为stderr,但是你不会在stderr中看到任何以字符串“something”开头的行。

这具有独特的优势,即不会颠倒或丢弃粗壮和肮脏,也不会将它们压在一起,也不会使用任何临时文件。


这会将command1 stderr重定向到command2 stdin,而将command1 stdout保留原样。

exec 3>&1
command1 2>&1 >&3 3>&- | command2 3>&-
exec 3>&-

采自LDP





stderr