从cron作业运行时,Bash脚本返回不同的值,而不是从命令行返回

时间:2012-03-26 13:28:44

标签: bash shell cron crontab

我有一个打算从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运行的字数匹配。

考虑到不同的值,我该如何解决?

4 个答案:

答案 0 :(得分:2)

当您运行哪个用户正在运行脚本时sh ./wordcount.sh

我怀疑正在执行cron的用户不一样,所以它的home(~)目录不同。

我将脚本中对~的任何引用更改为绝对目录路径。

答案 1 :(得分:2)

尝试添加

source ~/.bashrc

在shebang之后,另一个重要的事情是:

如果是bash,请不要使用sh来调用脚本!

使用sh时,bash处于POSIX模式。我怀疑这不是为了这个。

答案 2 :(得分:1)

在这里同意beny23,cron脚本中最常见的错误来自事实,即cron没有继承你的PATH。您必须在crontab中设置cronpath,或使用绝对路径。

第二个错误源可能是,它从不同的用户运行。

第三个,您直接呼叫sh scriptname,而不是scriptname,这意味着将忽略shebang。你为什么这样做?脚本是不是标记为可执行文件?

答案 3 :(得分:0)

我失去了很多时间,并且在shell脚本文件的开头只丢失了它:#!/bin/bash

相关问题