Chinaunix
标题:
案例讨论,关键字:while,重定向,变量,crontab
[打印本页]
作者:
芬达7402
时间:
2012-02-15 11:39
标题:
案例讨论,关键字:while,重定向,变量,crontab
背景描述:在/home/test目录下有脚本:test.sh,有文件123.txt。
脚本内容是:读取123.txt中的内容然后做成html格式的邮件发送。
相关代码段:
export PATH="/home/test:/bin.......xxxxxx"
while read line
do
抓取123.txt文件中的内容,通过echo来绘制html格式文件
done < ./123.txt
手工在/home/test目录下执行 sh test.sh, ./test.sh均能正常收到邮件并显示html表格。
大问题:写到crontab里每5分钟定时运行一次:*/5 * * * * sh /home/test/test.sh,收到的邮件只有一个html表格框架,没有123.txt中的内容。
引申问题:1 怀疑是while重定向问题,因为“done < ./123.txt”会再开一个子shell,在循环完毕后会关闭,在123.txt中取到的值可能返回不了test.sh产生的shell中。
讨论:同样的代码为什么手工执行就可以,crontab就不行?
引申问题:2 怀疑是文件路径问题,因为是使用的是相对路径"done < ./123.txt"。
讨论:在test.sh中已经在export PATH中加入了运行目录"/home/test"。
目前解决办法:在脚本中加个变量为file="/home/test/123.txt",使用"done < $file"后工作正常了。现在看来就是绝对路径和相对路径的问题,但我一直纳闷的就是在不修改脚本的前提下为啥手工执行脚本就ok,crontab就不行?
作者:
yangkyo821
时间:
2012-02-15 11:52
./是当前目录的意思,<./123.txt是指的当前目录下的123.txt文件作为标准输入。
环境变量PATH是命令搜索路径,而 123.txt不是命令,跟PATH无关
一个解决方法是用绝对路径
另一个方法是将当前路径设置为123.txt文件所在的路径,在while前面加一行 cd /home/test/
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2