Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 捕获stderr,但不捕获stdout_Bash_Shell - Fatal编程技术网

Bash 捕获stderr,但不捕获stdout

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脚本并尝试学习

在我的bash脚本中,我读入了一组如下所示的行

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)@Sandburg
    2>&1>/dev/null-echo Hello-stderr
    不会打印任何内容,因为
    echo
    会打印到stdout,并且会重定向到
    /dev/null
    。所有示例都使用
    mycommand
    ,这是一个将输出打印到stdout和stderr的命令。