Linux Perl脚本赢得';t在相对路径中运行下标
我有一个perl脚本:run.pl,cron每分钟都会调用它 run.pl所做的唯一事情就是调用另外两个脚本:download.pl和parse.pl: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,并检查
#!/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=`dirname "$0"`;
### call your scripts here relative to $rootdir