mysqldump --verbose -h $dbhost --max_allowed_packet=1G --extended-
insert --single-transaction --add-drop-database --opt $dbname --
user=$dbusername --password=$dbpassword | gzip -1 > $filename.sql.gz
echo $?
我在我的 bash 脚本中使用上面的代码来获取 mysql 转储并对其进行 gzip 压缩。
在允许脚本继续运行之前,我想确认 mysqldump 是否成功。例如,如果找不到主机,我该如何捕获该错误?
我不确定如何实现这一点。我从上面得到的当前输出如下:
mysqldump: Got error: 2005: Unknown MySQL server host 'test' (0) when
trying to connect
0
为什么找不到主机时我得到的是 0 成功代码?我认为这是因为 gzip 仍然成功,因为它生成了一个空文件......但我不知道如何解决这个问题。
当使用管道(|)时,只捕获管道最后一条命令的退出值。但是我们可以使用 set -o pipefail
解决这个问题。这会捕获管道中的非零退出代码
让你的 schell 脚本总是这样
#!/bin/bash
set -o pipefail
例子:
C02MLC76FD57:~ vkrishna$ cat testing.sh
#!/bin/bash
set -o pipefail
false | echo "hello world"
echo $?
C02MLC76FD57:~ vkrishna$ ./testing.sh
hello world
1
false
的退出状态始终为 1。
(或)
您还可以使用 PIPESTATUS
,如下所示
$ false | true
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
1 0
我更喜欢在 shell 脚本中使用 set -o pipefail
。
和
关于捕获错误,在执行脚本时将 stderr 重定向到一个文件以捕获实际错误。
例子:
文件名为backup.sh
./backup.sh 2>/tmp/backupError.log
这样,如果备份有效,一切正常,如果失败,我们会捕获错误。