如何在Bash脚本中的变量中存储标准错误

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

假设我有一个脚本,如下所示:

useless.sh

echo "This Is Error" 1>&2
echo "This Is Output" 

我有另一个shell脚本:

还有Useless.sh

./useless.sh | sed 's/Output/Useless/'

我希望将“这是错误”或任何其他stderr从useless.sh捕获到一个变量中。

注意,我正在使用stdout来做一些事情。我想继续使用stdout,所以在这种情况下将stderr重定向到stdout是没有帮助的。

./useless.sh 2> $ERROR | ...
./useless.sh 2> /tmp/Error
ERROR=`cat /tmp/Error`

有人有更好的主意吗?

提问于
用户回答回答于

因此,捕获错误文件将更加整洁:

ERROR=$(</tmp/Error)

shell识别这一点,不需要运行cat“来获取数据。

必须将整个管道构建到子shell中,最终将其最终的标准输出发送到一个文件中,这样您就可以将错误重定向到标准输出。

ERROR=$( { ./useless.sh | sed s/Output/Useless/ > outfile; } 2>&1 )

注意,分号是必需的(在经典的shell中--Bourne,Korn--当然;可能也在Bash中)。“{}‘I/O是否重定向于所包含的命令。正如所写的,它将捕获来自sed我也是。

用户回答回答于

还有Useless.sh

这将使能够将的输出输送到useless.sh通过命令编写脚本,例如sed并保存stderr在一个名为error。管道的结果被发送到stdout用于显示或用管道传送到另一个命令。

它设置了几个额外的文件描述符来管理重定向所需的重定向。

#!/bin/bash

exec 3>&1 4>&2 #set up extra file descriptors

error=$( { ./useless.sh | sed 's/Output/Useless/' 2>&4 1>&3; } 2>&1 )

echo "The message is \"${error}.\""

exec 3>&- 4>&- # release the extra file descriptors

扫码关注云+社区