10

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

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

您可以使用进程替换轻松捕获标准输出:

$ read b < <(echo hello world)

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

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

我想使用进程替换来捕获标准错误。我现在正在使用这个:

$ grep 2> log.txt

$ read b < log.txt

但我希望避免临时文件。

4

3 回答 3

13

将命令的标准错误重定向到标准输出:

$ 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.
于 2013-03-13T17:45:59.753 回答
2
$ grep 2> >(sed 's/e/E/g';)

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

编辑:您可以像这样修复这种不匹配:

$ grep 2> >(sed 's/e/E/g';); sync
于 2014-04-13T15:02:42.860 回答
1

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

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

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

echo $b

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

standard output standard error

这些echo语句只是向每个标准输出和标准错误输出一些内容的示例。

于 2014-10-17T10:23:56.467 回答