对于这个问题,我将使用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
但我希望避免临时文件。
答案 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
语句只是向标准输出和标准错误输出内容的示例。