我编写了一个小的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文件运行时的行数。
答案 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运行它时却没有,但删除每行上的前导空格可以解决问题。
关于为什么会出现这种情况的任何建议,我有兴趣知道。