This question already has answers here:
Pipe output and capture exit status in Bash
                                
                                    (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