bash脚本从shell运行,而不是从cron作业运行

Cron安装是vixie-cron

/etc/cron.daily/rmspam.cron

 #!/bin/bash /usr/bin/rm /home/user/Maildir/.SPAM/cur/*; 

我有这个简单的bash脚本,我想添加到一个cron作业(也包括之前的垃圾邮件学习命令),但这部分总是失败,“文件或目录未find”从我的数据是metachar正在interperted不正确时作为cron工作运行。 如果我从命令行执行脚本,它工作正常。

我想为什么这不工作,当然是一个工作解决scheme:)

谢谢

编辑#1回到这个问题,当我得到它的stream行问题徽章。 我第一次这样做,

 #!/bin/bash find /home/user/Maildir/.SPAM/cur/ -t file | xargs rm 

最近刚刚通过xargs手册页阅读并将其更改为此

 #!/bin/bash find /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm 

短xargs选项是-r

如果目录中没有文件,则通配符将不会被展开并直接传递给命令。 没有名为“*”的文件,然后命令失败,出现“文件或目录未找到”。 试试这个:

 if [ -f /home/user/Maildir/.SPAM/cur/* ]; then rm /home/user/Maildir/.SPAM/cur/* fi 

或者只是使用“-f”标志rm。 这个命令的另一个问题是当命令行的最大长度有太多的垃圾邮件时会发生什么。 像这样的东西可能是更好的整体:

 find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' + 

如果你有一个老的发现,一次只能执行一个文件:

 find /home/user/Maildir/.SPAM/cur -type f | xargs rm 

这处理太多的文件以及没有文件。 感谢Charles Duffy指出+选项在find中执行。

你在cronjob中指定脚本的完整路径吗?

 00 3 * * * /home/me/myscript.sh 

而不是

 00 3 * * * myscript.sh 

另一个说明是,在我可以访问的所有Linux机器上都是/ bin / rm 。 您是否仔细检查过您的机器上是否是/ usr / bin / rm

尝试添加

 MAILTO=your@email.address 

到你的cron文件的顶部,你应该得到任何输入/错误邮寄给你。

另外考虑添加命令作为一个cronjob

 0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/* 

尝试使用强制选项,忘记添加一个路径rm命令。 我认为这不应该需要…

 rm -f 

这将确保即使目录中没有文件,rm命令也不会失败。 如果这是一个shell脚本的一部分,*应该工作。 在我看来,你可能有一个空的目录…

我明白,脚本的其余部分正在执行,对吧?

rm是否确实位于系统上的/usr/bin/ ? 我一直认为rm应该驻留在/bin/