在 cron 中转义字符

sha*_*nuo 9 cron

以下在命令提示符下按预期工作。但它不适用于 cron。

mysqldumpslow <(tail -1000 `mysqladmin variables \
    | grep slow_query_log_file | awk '{print $4}'`) \
    | mail -s "slow log from `hostname` sorted by time" shantanu.oak`hostname`@gmail.com \
    > /root/slow_succ.txt 2> /root/slow_err.txt
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

/bin/sh: -c: line 0: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

某些字符是否需要在 cron 中转义?还是 cron 中的 subshel​​l 有问题?

Kyl*_*ith 13

我将扩展SvenW所说的内容,说明我会将这个命令放入脚本中有两个原因:

  1. 它避免了在 crontab 中转义字符的任何问题。
  2. 它允许您向其他管理员清楚地指示工作的内容,而不会浪费他们的任何周期来解密您创建的单行魔术。比如调用脚本/root/bin/dump_mysql_tables_and_email_failure_report.sh。您可能不在与其他管理员在一起的环境中,但这将有助于提醒一年后的想法!:)

  • 感谢“一年后你到底在想什么!”。 (2认同)

Sve*_*ven 5

cron 转义问题的最简单解决方案:将命令放在它自己的 shell 脚本中,然后从 cron 调用此脚本。


Lad*_*ada 5

它不起作用的原因cron是不是bash。使用方括号创建子shell 是bash 语法的一部分。一个线索是在错误消息的第一个“词”中。

反引号可以用来创建一个子shell,只是你已经在你的子shell中使用了反引号,所以你不能再次使用它们。

正如其他人已经说过的,编写一个脚本并从 cron 调用它。