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`