我有一个打算从cron运行的bash脚本。该脚本对文档中的单词进行计数,并将包含当前时间和单词计数的行附加到CSV文件。在相关部分中,脚本是:
EPOCH=$(date +"%s")
WCC=$(wc -w ~/path/filename.txt | sed 's/\/Users\/username\/path\/filename.txt//' | sed 's/ //g')
echo $EPOCH,$WCCH4 >> ~/path/wordcount-data.csv
此脚本使用以下条目从cron运行:
0 * * * * sh /Users/username/path/wordcount.sh
问题是,从cron运行时wc -w
返回的值与从shell运行时或从终端中执行的shell脚本运行时返回的值不同。换句话说,从cron执行的这个脚本的值当前是12438,但是在shell中运行wc -w filename.txt
或运行sh ./wordcount.sh
都返回值12445.为了它的价值,差异总是7,并且vim的字数与从cron运行的字数匹配。
考虑到不同的值,我该如何解决?
答案 0 :(得分:2)
当您运行哪个用户正在运行脚本时sh ./wordcount.sh
?
我怀疑正在执行cron的用户不一样,所以它的home(~
)目录不同。
我将脚本中对~
的任何引用更改为绝对目录路径。
答案 1 :(得分:2)
尝试添加
source ~/.bashrc
如果是bash,请不要使用sh
来调用脚本!
使用sh
时,bash处于POSIX
模式。我怀疑这不是为了这个。
答案 2 :(得分:1)
在这里同意beny23,cron脚本中最常见的错误来自事实,即cron没有继承你的PATH。您必须在crontab中设置cronpath,或使用绝对路径。
第二个错误源可能是,它从不同的用户运行。
第三个,您直接呼叫sh scriptname
,而不是scriptname
,这意味着将忽略shebang。你为什么这样做?脚本是不是标记为可执行文件?
答案 3 :(得分:0)
我失去了很多时间,并且在shell脚本文件的开头只丢失了它:#!/bin/bash