2013-03-13 54 views
2

对于这个问题,我将使用grep,因为它的使用文本打印到stderr进程替换捕获标准错误

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

你可以用进程替换标准输出轻松捕捉

$ read b < <(echo hello world) 

但是标准错误滑过过程替换并打印到控制台上

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

我想用流程替换捕获stderr。我现在用这个

$ grep 2> log.txt 

$ read b < log.txt 

但我希望避免临时文件。通过使用$()

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

虽然常规方式将一个命令的输出保存到在击一个变量是:

回答

4

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

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

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

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

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

你几乎是对的。你的流程替换中有一个不必要的';'。这就是为什么你需要';同步“来解决这个问题。试试:'grep 2>>(sed's/e/E/g')',然后你将直接输出结果。 –

0

一种整体壳层更普遍的解决方案是使用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陈述只是一个例子,输出的东西每个标准输出和标准错误的。

相关问题