Bash 捕获stderr,但不捕获stdout
在我的bash脚本中,我读入了一组如下所示的行Bash 捕获stderr,但不捕获stdout,bash,shell,Bash,Shell,在我的bash脚本中,我读入了一组如下所示的行 arg $PROG arg arg 我希望能够运行该行,将STDERR捕获为变量,并防止STDOUT或STDERR打印到屏幕上。到目前为止,这是我的解决方案,但error变量始终为空 $PROG=/c/Program1 { error=$($(eval $line) 2>&1 1>&$out); } {out}>&1 echo $error 请详细解释解决方案。我不熟悉bashshell脚本并尝试学习
arg $PROG arg arg
我希望能够运行该行,将STDERR捕获为变量,并防止STDOUT或STDERR打印到屏幕上。到目前为止,这是我的解决方案,但error变量始终为空
$PROG=/c/Program1
{ error=$($(eval $line) 2>&1 1>&$out); } {out}>&1
echo $error
请详细解释解决方案。我不熟悉bashshell脚本并尝试学习 对于同时打印到stdout和stderr的命令,如下所示:
mycommand () { echo "stdout"; echo "stderr" >&2; }
如果我正常发出,我会看到所有输出:
$ mycommand
stdout
stderr
我可以将stdout或stderr重定向到/dev/null
,这样它就不会被打印:
$ mycommand >/dev/null # Equivalent to 1>/dev/null
stderr
$ mycommand 2>/dev/null
stdout
如果只想捕获stderr,首先必须将stderr重定向到stdout out当前指向的位置,然后将stdout重定向到/dev/null
:
error="$(2>&1 1>/dev/null mycommand)"
现在error
只包含来自stderr的输出:
$ echo "$error"
stderr
线路上的位置并不重要,但重定向的顺序确实重要,因此这具有相同的效果:
error="$(mycommand 2>&1 1>/dev/null)"
但这并不是:
error="$(1>/dev/null 2>&1 mycommand)"
最后一个命令将stdout和stderr重定向到/dev/null
,并且error
将为空
一个很好的重定向资源位于
关于您尝试的内容,有几点建议:
- 赋值要求在参数名称中不使用
,因此它应该是$
,而不是PROG=/c/Program1
$PROG=/c/Program1
- 不鼓励使用大写变量名,因为它们更可能与环境变量冲突
- 在99%的情况下,有一种解决方案可以避免
,看看为什么这是个好主意eval
我提供了一个复制品,但你也可以考虑。在某些情况下它不起作用。像进程替换
diff-u&1>/dev/null-echo Hello-stderr)@Sandburg2>&1>/dev/null-echo Hello-stderr
不会打印任何内容,因为echo
会打印到stdout,并且会重定向到/dev/null
。所有示例都使用mycommand
,这是一个将输出打印到stdout和stderr的命令。