【问题标题】:Redirect STDERR to a variable [duplicate]将 STDERR 重定向到变量 [重复]
【发布时间】:2017-07-21 11:56:10
【问题描述】:

我的这段代码会产生错误,它可以抑制 STDOUT,但它不会将 STDERR 存储在变量 ERROR 中。

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

【问题讨论】:

  • 在 shell 变量赋值中,= 周围不能有空格。
  • 而且你不应该使用大写的变量名,那些是为应用程序环境变量保留的。
  • 将 stderr 重定向到 stdout 由 2>&1 完成,& 用于跟随文件描述符。所以下面的代码应该适合你。 ERROR=$({ memtester 900 > /dev/null; } 2>&1

标签: linux bash shell stdout stderr


【解决方案1】:

你可以这样捕捉它:

error=$(memtester 900 1 2>&1 >/dev/null)

重定向操作符的顺序在这里很重要。

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

【讨论】:

  • 为什么我们需要重定向到 /dev/null?那不会失去输出吗?
  • @djna 正常输出确实会丢失,但显然 OP 的重点是仅捕获命令错误(如果有)。如果没有>/dev/null,这个变量也将包含输出。
  • @user2489314:这对你有用吗?
  • @djna - 不,这不是重定向的工作方式。命令 `2>&1' 并不意味着遵循 &1 (stdout)。意味着将 fd 2 (stderr) 发送到 fd1 CURRENTLY 所在的任何位置 = 命令(管道)缓冲区或 /dev/tty(如果直接从 CLI 运行)。如果您稍后将 fd1 重定向到其他地方(这个对 dev/null 的答案中的文件或类似文件),fd2 仍然会转到之前绑定 fd1 的设备(命令行中的命令行或 /dev/tty)。这里解释得很好:mywiki.wooledge.org/BashFAQ/002
  • @George Vasilou 啊哈!谢谢乔治。 (曾经有一段时间我知道这些东西 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 2014-07-22
  • 1970-01-01
  • 2022-01-18
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多