进程替换捕获stderr

时间:2013-03-13 17:42:07

标签: bash stderr process-substitution

对于这个问题,我将使用grep,因为它的用法文本打印到stderr

$ grep
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

您可以使用流程替换轻松捕获stdout

$ read b < <(echo hello world)

然而,stderr滑过进程替换并打印到控制台

$ read b < <(grep)
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

我想使用进程替换来捕获stderr。我现在正在使用

$ grep 2> log.txt

$ read b < log.txt

但我希望避免临时文件。

3 个答案:

答案 0 :(得分:7)

将命令的stderr重定向到stdout:

$ read "b" < <(grep 2>&1)
$ echo "$b"
Usage: grep [OPTION]... PATTERN [FILE]...

虽然在Bash中将命令输出保存到变量的传统方法是使用$()

$ b=$(grep 2>&1)
$ echo "$b"
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

答案 1 :(得分:2)

$ grep 2> >(sed 's/e/E/g';)

您可以捕获 grep 的标准输出并将其传输到 sed 但是,我不知道为什么(也不怎么避免它)它需要一个额外的INTRO来返回控制并显示提示。

修改:你可以像这样解决这个不匹配问题:

$ grep 2> >(sed 's/e/E/g';); sync

答案 2 :(得分:1)

整个子shell的更通用的解决方案是使用exec重定向其标准错误。

如果OP的示例基于grep是单个命令,那么在子shell中有一系列命令,那么你可以像这样重定向整个子shell的标准错误: / p>

b=$(cat <(
    exec 2>&1
    echo "standard output"
    echo "standard error" 1>&2
   ))    

echo $b

将标准输出和标准错误的输出放入变量$b

standard output standard error

echo语句只是向标准输出和标准错误输出内容的示例。