将 STDERR 重定向到一个变量

5

我有一段代码,它产生了一个错误,虽然它可以抑制标准输出(STDOUT),但它不能将标准错误(STDERR)存储在变量ERROR中。

ERROR = $(memtester 900 1 > /dev/null)

在shell变量赋值时,等号前后不能有空格。 - Barmar
你不应该使用大写的变量名,那些是为应用程序环境变量保留的。 - Barmar
将stderr重定向到stdout可以通过2>&1完成,&用于跟踪文件描述符。因此,以下代码应该适用于您。 ERROR=$({ memtester 900 > /dev/null; } 2>&1 - rowan
1个回答

9
您可以这样捕获它:
error=$(memtester 900 1 2>&1 >/dev/null)

此处重定向运算符的顺序非常重要。

  • 2>&1 - 将标准错误输出重定向到标准输出
  • >/dev/null - 将标准输出重定向到/dev/null

为什么我们需要将重定向到/dev/null?那不会丢失输出吗? - djna
3
确实,正常输出将会丢失。但是很明显,OP 的意图是仅捕获命令的错误(如果有)。如果没有 >/dev/null ,这个变量也会包含输出内容。 - George Vasiliou
@user2489314:这对你有用吗? - anubhava
@George Vasilou 但是stderr已经被重定向到stdout,因此stderr输出也被发送到/dev/null。就目前而言,错误变量将不包含任何内容。 - djna
3
@djna - 不,重定向并不是这样工作的。命令2>&1并不意味着跟随&1(标准输出)。它的意思是将文件描述符2(标准错误)发送到文件描述符1当前所在的位置 = 命令(管道)缓冲区或者如果直接从CLI运行,则为/dev/tty。如果您稍后将文件描述符1重定向到其他位置(例如文件或像这个答案中的/dev/null),文件描述符2仍然去到与文件描述符1之前绑定的设备(命令管道或命令行中的/dev/tty)。在这里得到了很好的解释:http://mywiki.wooledge.org/BashFAQ/002 - George Vasiliou
2
@George Vasilou 啊哈!谢谢George。(曾经我也懂这些东西的;-)) - djna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接