对于像这样同时打印到 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 将为空。
Bash Hackers Wiki 上有一个很好的重定向资源。
您尝试过的一些建议:
- 赋值要求参数名中不能使用
$,所以应该是PROG=/c/Program1而不是$PROG=/c/Program1。
- 不鼓励使用大写变量名,因为它们更有可能与环境变量发生冲突。
- 在 99% 的情况下,有一个避免
eval 的解决方案,请参阅 BashFAQ/048 为什么这是一个好主意。