我有一个bash脚本,我写过它来识别文件中是否存在某个字符串,然后将文件名输出为“noString.txt”的“hasString.txt”。我正在使用ack -i 'mystring' 'searchDir'
来查找我正在寻找的内容。
奇怪的是,当我通过终端手动调用脚本时,它工作正常,但是当cron调用脚本时,我得到以下错误消息输出:
~/sourceDir/script.sh: line 30: ack: command not found
。
为什么在手动调用时它会工作但在cron调用时无法找到ack命令?
编辑:添加相关代码和cron文件
Lookout脚本 - 确定是否有任何要处理的文件。
if [[ $(ls -A ${PWD}/*.zip) ]]; then
while [ $different -eq 1 ]; do
du -h 1> $compare1
ls -laR >> $compare1
sleep 25s
du -h 1> $compare2
ls -laR >> $compare2
if cmp $compare1 $compare2 ; then
mkdir -p $LOGAREA
mkdir -p $workarea/zip/unzip
touch $LOG
touch $ERRORLOG
sleep 2s
source ~/Desktop/Scripts/readfolderfiles.sh $drop
mv *epub $workarea
rm $compare1
rm $compare2
bash ~/Desktop/Scripts/Page_Label/script/searchString.sh
different=0
else
echo
fi
done 1> $LOG 2> $ERRORLOG
else
rm ~/Desktop/page_labels.running
rm $drop/page_labels.running
fi
识别并报告脚本 - 生成顶部提到的输出
for files in *.zip; do
#move and unzip the files
mv $workarea/$files $workarea/zip/unzip/${files%.epub}.zip
sleep 2s
unzip zip/unzip/*.zip -d zip/unzip/${files%.epub}
mv zip/unzip/*.zip zip
sleep 2s
cd $workarea/zip/unzip
for dir in *; do
# Search the files for the searchString
if ack --ignore-case 'searchString' $dir; then
echo $dir >> $drop/Has_searchString.txt
echo
rm -r $dir
sleep 5s
else
echo $dir >> $drop/No_searchString.txt
echo
rm -r $dir
sleep 5s
fi
done
cd $workarea
done
Cron doc
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
#### Backup Files
* * * * 1,2,3,4,5 bash ~/Desktop/Scripts/searchScript.sh &> /dev/null;
答案 0 :(得分:3)
这是因为未定义搜索路径。
在脚本中使用完整路径或定义路径
选项1:
/path/to/ack -i 'mystring' 'searchdir'
选项2:
PATH=/path/to/ackdir:$PATH
export PATH
ack -i 'mystring' 'searchdir'
答案 1 :(得分:2)
您需要在cron作业中设置PATH环境变量。 所以将它添加到cron文件的顶部:
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
注意:还要添加#!/ bin / bash,因此您也不必添加shell环境变量。