为了账号安全,请及时绑定邮箱和手机立即绑定

Bash脚本-将stderr存储在变量中

Bash脚本-将stderr存储在变量中

千万里不及你 2019-12-02 09:55:17
我正在编写一个脚本来备份数据库。我有以下几行:mysqldump --user=$dbuser --password=$dbpswd  \   --host=$host $mysqldb | gzip > $filename我想将stderr分配给一个变量,以便它将向自己发送一封电子邮件,让我知道如果出现问题,会发生什么。我已经找到了将stderr重定向到stdout的解决方案,但是由于stdout已经(通过gzip)发送到文件中,因此我无法做到这一点。如何将stderr分别存储在变量$ result中?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

尝试将stderr重定向到stdout并$()用于捕获它。换一种说法:


VAR=$((your-command-including-redirect) 2>&1)

由于您的命令将stdout重定向到某个地方,因此它不应干扰stderr。可能有一种更简洁的编写方法,但这应该可行。


编辑:


这确实有效。我已经测试过了:


#!/bin/bash                                                                                                                                                                         

BLAH=$((

(

echo out >&1

echo err >&2

) 1>log

) 2>&1)


echo "BLAH=$BLAH"

将打印BLAH=err并且文件log包含out。


查看完整回答
反对 回复 2019-12-02
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

对于Bash中的任何通用命令,您可以执行以下操作:


{ error=$(command 2>&1 1>&$out); } {out}>&1

常规输出正常出现,任何将stderr的内容都捕获在$ error中(使用它保存换行符时将其引用为“ $ error”)。要将stdout捕获到文件,只需在末尾添加重定向,例如:


{ error=$(ls /etc/passwd /etc/bad 2>&1 1>&$out); } {out}>&1 >output

分解它,从外面读入它:


为整个块创建文件描述$ out,复制stdout

在$ error中捕获整个命令的标准输出(但请参见下文)

该命令本身将stderr重定向到stdout(在上面捕获),然后将stdout从块外部重定向到原始stdout,因此仅捕获stderr


查看完整回答
反对 回复 2019-12-02
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您可以将stdout引用从重定向之前保存到另一个文件号(例如3)中,然后将stderr重定向到该文件:


result=$(mysqldump --user=$dbuser --password=$dbpswd  \

   --host=$host $mysqldb 3>&1 2>&3 | gzip > $filename)

因此3>&1会将文件编号3重定向到stdout(注意,这是在使用管道将stdout重定向之前)。然后2>&3将stderr重定向到3号文件,该文件现在与stdout相同。最后,将stdout通过馈入管道进行重定向,但这不会影响文件编号2和3(请注意,从gzip重定向stdout与mysqldump命令的输出无关)。


编辑:更新了命令以从命令重定向stderr mysqldump而不是gzip,我的第一个答案太快了。


查看完整回答
反对 回复 2019-12-02
  • 3 回答
  • 0 关注
  • 773 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信