将Stderr发送到dev / null但如果没有发生错误,请继续

时间:2013-12-02 15:50:48

标签: shell io-redirection launchd

我有一个shell脚本,我在launchd中运行,备份我的MAMP MySQL安装。不幸的是,如果MAMP没有运行,它会抛出错误并将其发送到内部邮件。我希望忽略任何错误(发送到/dev/null),但如果没有错误,则继续。

我尝试过以下操作,在MAMP运行时正确创建备份,但如果没有运行则发送邮件(stderr):

#!/bin/bash
/Applications/MAMP/Library/bin/mysqldump --opt -u root -pPASSWORDHERE --host=localhost --all-databases > | gzip -9 > /Users/Paul/Dropbox/Development/Shared\ DBs/BACKUPS/all_databases_-`date "+%Y-%m-%d_%H.%M.%S"`.sql.gz

我也试过这个:

#!/bin/bash
/Applications/MAMP/Library/bin/mysqldump --opt -u root -pPASSWORDHERE --host=localhost --all-databases 2> /dev/null 1> | gzip -9 > /Users/Paul/Dropbox/Development/Shared\ DBs/BACKUPS/all_databases_-`date "+%Y-%m-%d_%H.%M.%S"`.sql.gz

但这根本不起作用......

如果我需要错误:

  • 发送至/dev/null
  • 时出错
  • 没有要创建的Gzipped文件

如果我没需要错误:

  • 要创建的Gzipped mysqldump

有谁知道我哪里出错了?

提前感谢您的帮助。

按以下编辑

我现在有:

#!/bin/bash
# Create the backup name
BACKUP_NAME="/Users/Paul/Dropbox/Development/Shared DBs/BACKUPS/all_databases_-$(date "+%Y-%m-%d_%H.%M.%S").sql"
# Run mysqldump and create a raw backup
/Applications/MAMP/Library/bin/mysqldump --opt -u root -proot --host=localhost --all-databases 2> /dev/null > ${BACKUP_NAME}
# If no errors
if [$? = 0]
then
  # Create the gzip backup
  gzip -c9 ${BACKUP_NAME} > ${BACKUP_NAME}.gz
fi
# In any cases remove raw backup
rm -f ${BACKUP_NAME}

但即使没有错误,也不会生成文件。

编辑 - 完成代码

使用下面的JML更新代码(非常感谢),我仍然遇到错误,但这是因为我的路径中有空格,因此需要在两个地方引用标记。

最终,工作代码:

#!/bin/sh

# Create the backup name
BACKUP_NAME="/Users/Paul/Dropbox/Development/Shared DBs/BACKUPS/all_databases_-$(date +%Y-%m-%d_%H.%M.%S).sql"

# Run mysqldump and create a raw backup
/Applications/MAMP/Library/bin/mysqldump --opt --user=root --password=root --host=localhost --all-databases 2> /dev/null >${BACKUP_NAME}

# If no errors, create the gzip backup
test $? = 0 && gzip -c9 "${BACKUP_NAME}" > ${BACKUP_NAME}.gz

# In any cases remove raw backup
rm -f "${BACKUP_NAME}" 

1 个答案:

答案 0 :(得分:2)

为什么不分裂?像这样:

#!/bin/sh

# Create the backup name
BACKUP_NAME="/tmp/backup-$(date +%Y-%m-%d_%H.%M.%S).sql"

# Run mysqldump and create a raw backup
mysqldump --opt --user=root --password=root --host=localhost --all-databases 2>/dev/null >"${BACKUP_NAME}"

# If no errors, create the gzip backup
test $? = 0 && gzip -c9 "${BACKUP_NAME}" > "${BACKUP_NAME}.gz"

# In any cases remove raw backup
rm -f "${BACKUP_NAME}"