2010-11-08 77 views
0

我有一个perl脚本:每分钟由cron调用的run.pl。Perl脚本不会在相对路径中运行下标

唯一run.pl所做的就是调用其他两个脚本:download.pl和parse.pl:

#!/usr/bin/perl 
use warnings; 
use strict; 

do 'download.pl'; 
do 'parse.pl'; 
print "done!\n"; 

在download.pl和parse.pl两种打印与“下载完毕”和“完成解析” 现在我将脚本输出到/var/log/script.log并检查要运行的脚本。

run.pl脚本运行良好,它输出“done!”到日志文件。但另外两个脚本不会被调用。我认为这是一个相对路径问题,它在我使用绝对路径时起作用。

但是,这就是问题所在,脚本处于测试阶段并且每次都会更改路径,所以总是会改变绝对路径。

有没有办法让脚本从相对路径运行?

编辑: 当我使用“perl run.pl”从命令行自己运行它时,它会毫无问题地运行脚本。

+0

其他脚本总是在同一个目录下,因此'./download.pl'可以工作吗? – Neth 2010-11-08 16:59:12

回答

4

Cron作业不能运行在shell登录会看到的相同环境中。 cron作业通常具有cron用户的主目录,因为它是默认的工作目录。 解决此问题的一个选项是使用FindBin来查找脚本所在的目录,并将您的路径建立在该路径之外。

#!/usr/bin/perl 
use warnings; 
use strict; 
use FindBin qw($Bin); 

do $Bin.'download.pl'; 
do $Bin.'parse.pl'; 
print "done!\n"; 

你可能会更好转download.plparse.pl成真正的模块,它可能会节省你从长远来看一些努力。

+0

不要做'做'。 ☹ – tchrist 2010-11-08 17:05:14

+0

@tchrist,我同意,请参阅我答案的最后一句话,但如果OP发现“do”是正确选择的罕见情况,那么我认为'FindBin'是一个很好的答案。 – 2010-11-08 18:19:49

+0

我本人就是'FindBin'的粉丝,虽然这确实让我在热水中与我普遍尊重的人们保持着热情。 – tchrist 2010-11-08 18:22:00

5

恩,你为什么用do?这不会“叫”一个程序,你知道!

这些库模块或程序?

另外,程序预计会在$ENV{PATH}中找到,而库预计会在@INC中找到。那些几乎肯定是不同的东西。

我的建议是:

  1. $ENV{PATH}调用另一个程序,使用system()或反引号。
  2. 要在@INC中加载库,请使用requireuse
  3. 保留do FILE以异乎寻常的巫术目的,几乎肯定不适用于此。
+0

@Hasturkun:你几乎不需要把我自己的着作回复给我。 ☹ – tchrist 2010-11-08 17:12:00

+0

对不起,我一定会掩饰第三段 – Hasturkun 2010-11-08 17:15:07

0
$rootdir=`dirname "$0"`; 

### call your scripts here relative to $rootdir 

不好吗?

+0

当Perl提供一个模块可以实现同样的功能而不会使用shell的成本/安全性问题时,请不要使用shell命令。 '使用File :: Basename qw(dirname);' – 2010-11-08 18:23:23