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

我正在编写一个脚本来备份数据库。我有以下几行:


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

   --host=$host $mysqldb | gzip > $filename

我想将stderr分配给一个变量,以便它将向自己发送一封电子邮件,让我知道如果出现问题,会发生什么。我已经找到了将stderr重定向到stdout的解决方案,但是由于stdout已经(通过gzip)发送到文件中,因此我无法做到这一点。如何将stderr分别存储在变量$ result中?


千万里不及你
浏览 838回答 3
3回答

精慕HU

尝试将stderr重定向到stdout并$()用于捕获它。换一种说法:VAR=$((your-command-including-redirect) 2>&1)由于您的命令将stdout重定向到某个地方,因此它不应干扰stderr。可能有一种更简洁的编写方法,但这应该可行。编辑:这确实有效。我已经测试过了:#!/bin/bash                                                                                                                                                                         BLAH=$(((echo out >&1echo err >&2) 1>log) 2>&1)echo "BLAH=$BLAH"将打印BLAH=err并且文件log包含out。

料青山看我应如是

对于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

收到一只叮咚

您可以将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,我的第一个答案太快了。
打开App,查看更多内容
随时随地看视频慕课网APP