Perl脚本不会在相对路径中运行下标

时间:2010-11-08 16:46:15

标签: linux perl path relative absolute

我有一个perl脚本:每分钟都被cron调用的run.pl。

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!”到日志文件。但是没有调用其他两个脚本。我认为这是一个相对路径问题,当我使用绝对路径时它会起作用。

但这就是问题,脚本在teststage中并且每次都改变路径,总是改变绝对路径会很麻烦。

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

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

3 个答案:

答案 0 :(得分:5)

嗯,你为什么要使用do?你知道,那不会“召唤”一个节目!

这些图书馆模块或程序吗?

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

我的建议是:

  1. 要调用$ENV{PATH}中的其他程序,请使用system()或反对。
  2. 要在@INC中加载图书馆,请使用requireuse
  3. do FILE保留为异乎寻常的巫术目的,几乎肯定不适用于此。

答案 1 :(得分: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转换为实际模块可能会更好,从长远来看,它可能会为您省去一些努力。

答案 2 :(得分:0)

$rootdir=`dirname "$0"`;

### call your scripts here relative to $rootdir

无济于事?