This question already has answers here:
Pipe output and capture exit status in Bash
(15个答案)
2年前关闭。
我在我的bash脚本中使用上面的代码进行mysql转储并将其gzip化。
我想在允许脚本继续运行之前确认mysqldump是否成功。如果例如找不到主机,我该如何捕获该错误?
我不确定如何实现这一目标。我上面得到的电流输出如下:
为什么找不到主机时我得到0成功代码?我认为这是因为gzip仍然成功,因为它会生成一个空文件...但是我不知道该如何解决。
例:
(要么)
您还可以如下使用
我更喜欢在shell脚本中使用
和
关于捕获错误,在执行脚本时将stderr重定向到文件以捕获实际错误。
例:
文件名是backup.sh
这样,如果备份有效,则一切正常,如果备份失败,我们将捕获错误。
(15个答案)
2年前关闭。
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
这样,如果备份有效,则一切正常,如果备份失败,我们将捕获错误。
关于mysql - 如何在bash脚本中捕获mysqldump错误? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52211039/
10-16 20:46