Bash脚本 – 在variables中存储stderr

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

mysqldump --user=$dbuser --password=$dbpswd \ --host=$host $mysqldb | gzip > $filename 

我想把stderr分配给一个variables,这样它会发送一封邮件给我自己,让我知道发生了什么事情,如果出现问题。 我已经find解决schemeredirect标准输出到标准输出,但我不能这样做,标准输出已经被发送(通过gzip)到一个文件。 我怎样才能单独存储stderr在一个variables$结果?

尝试将stderrredirect到标准输出,并使用$()来捕获。 换一种说法:

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

由于你的命令在某处redirect标准输出,它不应该干扰标准错误。 可能有一个更清晰的方式来写它,但这应该工作。

编辑:

这确实有用。 我testing过了

 #!/bin/bash BLAH=$(( ( echo out >&1 echo err >&2 ) 1>log ) 2>&1) echo "BLAH=$BLAH" 

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

对于Bash中的任何通用命令,可以这样做:

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

正常的输出显示正常,任何stderr都被捕获到$ error中(当用它来保存换行符时,引用它为“$ error”)。 要将stdout捕获到文件,只需在最后添加redirect,例如:

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

打破它,从外面看,它:

  • 为整个块创build文件描述$ out,复制stdout
  • 在$ error中捕获整个命令的stdout(但是在下面看到)
  • 命令本身将stderrredirect到标准输出(上面被捕获),然后将标准输出从块外部输出到原始标准输出,因此只有stderr被捕获

您可以保存标准输出参考,然后将其redirect到另一个文件编号(例如3),然后将stderrredirect到:

 result=$(mysqldump --user=$dbuser --password=$dbpswd \ --host=$host $mysqldb 3>&1 2>&3 | gzip > $filename) 

所以3>&1会将文件编号3redirect到标准输出(注意这是标准输出redirect与pipe道之前)。 然后2>&3将stderrredirect到文件编号3,现在它与stdout相同。 最后,stdout被redirect到一个pipe道中,但是这不会影响文件编号2和3(注意,从gzipredirect标准输出与mysqldump命令的输出无关)。

编辑:更新命令redirectstderr从mysqldump命令而不是gzip ,我太快在我的第一个答案。

dd写stdout和stderr:

 $ dd if=/dev/zero count=50 > /dev/null 50+0 records in 50+0 records out 

这两个stream是独立的和可单独redirect的:

 $ dd if=/dev/zero count=50 2> countfile | wc -c 25600 $ cat countfile 50+0 records in 50+0 records out $ mail -s "countfile for you" thornate < countfile 

如果你真的需要一个variables:

 $ variable=`cat countfile`