如何将mysqldump的stderr错误信息存入Bash脚本变量?
解决方法:同时导出mysqldump内容到文件并捕获错误信息到变量
你的问题核心是:之前的写法仅将stdout重定向到文件,但$()/反引号捕获的是命令的stdout,而stderr未被处理,因此变量始终为空。要实现stdout写入目标文件、stderr存入变量,可以用以下两种简洁方式:
方法一:利用大括号组重定向stderr
# 执行mysqldump,将标准输出写入文件,同时捕获标准错误到变量 dumpresult=$( { mysqldump --user="${dbuser}" --password="${dbpw}" "${dbname}" > "${desdir}/${filename_sql}"; } 2>&1 )
原理:
- 大括号
{ ...; }将mysqldump命令组包裹,命令内部已将stdout重定向到指定文件 2>&1将整个命令组的stderr重定向到stdout,让$()捕获到mysqldump输出的所有错误信息
方法二:使用文件描述符保存原stdout
如果需要更灵活的文件描述符控制,可采用这种方式:
# 将当前终端的stdout保存到文件描述符3 exec 3>&1 # 执行命令:stdout写入目标文件,stderr被$()捕获,同时恢复原stdout渠道 dumpresult=$(mysqldump --user="${dbuser}" --password="${dbpw}" "${dbname}" > "${desdir}/${filename_sql}" 2>&1 1>&3) # 关闭临时文件描述符 exec 3>&-
原理:
exec 3>&1把当前终端的stdout复制到FD3临时保存- 命令中的
1>&3将mysqldump的stdout恢复到原输出渠道,但提前通过> "${desdir}/${filename_sql}"已将stdout重定向到文件,最终实现stdout写入文件、stderr被$()捕获
你之前写法无效的原因
- 前两种写法:
$()/反引号捕获的是命令的stdout,但你已将stdout重定向到文件,因此捕获内容为空,stderr未被处理 - 第三种写法:嵌套反引号未改变stdout被重定向的事实,echo输出的是空内容
- 第四种写法:echo输出的是命令文本本身,并非命令执行的错误信息,完全不符合需求
额外建议
- 所有路径和变量建议用双引号包裹,避免文件名/变量值含空格时出现语法错误
- 不建议在命令行明文指定密码,可通过
~/.my.cnf配置文件设置账号密码,更安全:
配置后执行mysqldump无需再加[mysqldump] user=your_db_user password=your_db_password--user和--password参数
内容的提问来源于stack exchange,提问作者Gary U.U. Unixuser
相关产品推荐
相关产品推荐

