【问题标题】:Send Stderr to dev/null but if no error occurs, continue on将 Stderr 发送到 dev/null 但如果没有发生错误,请继续
【发布时间】:2013-12-02 15:50:47
【问题描述】:

我有一个在 launchd 中运行的 shell 脚本,用于备份我的 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}" 

【问题讨论】:

    标签: shell io-redirection launchd


    【解决方案1】:

    为什么不拆分?像这样的:

    #!/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}"
    

    【讨论】:

    • 请根据这个答案查看我目前拥有的代码的更新问题,但它仍然不起作用。
    • 如果您评论rm 行,是否创建了任何备份文件?
    • 没有。错误邮件说:/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'/bin/sh: -c: line 1: syntax error: unexpected end of file
    • 抱歉回复缓慢,但这对我有用,只需稍作修改即可在两个地方包含引号,因为路径中有空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2011-10-19
    • 2011-05-11
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多