Linux Perl脚本赢得';t在相对路径中运行下标

Linux Perl脚本赢得';t在相对路径中运行下标,linux,perl,path,relative-path,absolute-path,Linux,Perl,Path,Relative Path,Absolute Path,我有一个perl脚本:run.pl,cron每分钟都会调用它 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,并检查

我有一个perl脚本:run.pl,cron每分钟都会调用它

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”从命令行运行它时,它运行脚本时不会出现问题。

Cron作业的运行环境与shell登录所看到的环境不同。cron作业通常将cron用户的主目录作为默认工作目录。 解决这个问题的一个方法是使用它来定位脚本所在的目录,并以此为基础创建路径

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

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

您最好将
download.pl
parse.pl
转换为真正的模块,这样从长远来看可能会节省一些精力。

嗯,为什么要使用
do
?你知道,那不是“调用”程序

这些是库模块还是程序

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

我的建议是:

  • 要在
    $ENV{PATH}
    中调用另一个程序,请使用
    system()
    或backticks
  • 要在
    @INC
    中加载库,请使用
    require
    use
  • do FILE
    保留到异国情调的魔法用途,而这些用途在这里几乎肯定不适用

  • 没有帮助?

    其他脚本总是在同一个目录中,这样“/download.pl”就可以工作了吗?@Hasturkun:你几乎不需要引用我自己的文章。☹对不起,我一定是掩饰了第三个paragraph@tchrist,我同意,请看我答案的最后一句话,但是如果OP发现了一个罕见的情况,
    do
    是正确的选择,那么我认为
    FindBin
    是一个很好的答案。我自己就是
    FindBin
    的粉丝,尽管这确实会让我与我通常尊重其观点的人陷入困境,但当Perl提供的模块能够实现同样的功能时,不要使用shell命令,因为它不会带来使用shell的成本/安全问题<代码>使用文件::Basename qw(dirname)
    $rootdir=&#x60;dirname "$0"&#x60;;
    
    ### call your scripts here relative to $rootdir