为什么我的if语句在Ubuntu(12.04和14.04)的crontab中运行时失败?

时间:2015-09-08 22:39:17

标签: bash crontab

我编写了一个小的bash脚本来存档我的.bash_history文件,允许我保持常规.bash_history文件相当小,但将历史记录保存在.bash_history.archive文件中。当我从命令行运行它时,它运行正常,但是当它从crontab运行时(在Ubuntu 12.04和14.04上),它失败并显示如下错误消息:

/usr/local/bin/archive_bash_history: 7: /usr/local/bin/archive_bash_history: 15222: not found

脚本是:

 #!/bin/bash
 umask 077
 max_lines=50000

 linecount=$(wc -l < ~/.bash_history)

 if (($linecount > $max_lines)); then
         prune_lines=$(($linecount - $max_lines))
         head -$prune_lines ~/.bash_history >> ~/.bash_history.archive \
                && sed -e "1,${prune_lines}d"  ~/.bash_history > ~/.bash_history.tmp$$ \
                && mv ~/.bash_history.tmp$$ ~/.bash_history
 fi

15222号码是.bash_history文件运行时的行数。

2 个答案:

答案 0 :(得分:4)

可能是因为您的脚本在普通的POSIX shell而不是bash中运行。 (( ))是一个bash扩展,如果你在没有它的shell中运行if (( ... )); then行,它将创建一个子shell的子shell来运行命令$linecount > $max_lines - - 这意味着它尝试将15222作为命令执行,并将输出重定向到名为“50000”的文件中。不是你想要的。

至于为什么会发生这种情况......我的猜测是因为你在shebang之前有一个空格(#!/bin/bash)。为了让操作系统识别出一个shebang,“#!” 必须是文件的前两个字节。由于没有被识别,cron可能会重新使用/ bin / sh来运行它。当你从命令行运行它时,你正在使用bash,它的后备就是使用它自己。

答案 1 :(得分:0)

因此,当我打字时,我决定尝试修改要引用的行 - 并注意到我的脚本中的每一行在行的开头都有一个空格。如果我从bash shell运行它,我不完全确定它为什么会起作用,但是当我从crontab运行它时却没有,但删除每行上的前导空格可以解决问题。

关于为什么会出现这种情况的任何建议,我有兴趣知道。