Perl - Могу ли я получить пути, связанные с тем, где находится сценарий и откуда он был выполнен? - PullRequest
5 голосов
/ 26 января 2011

Я ищу способ получить две части информации:

  • Полный путь к месту расположения скрипта, включая его имя
  • Полный путь, с которого был выполнен скрипт

Я знаю, что вы можете использовать $0 для получения имени файла, но есть ли другие зарезервированные переменные, которые являются родными для Perl, которые дадут мне то, что я ищу?

Я бы предпочел не использовать никаких специальных модулей, но если это единственный способ, пусть будет так.

Ответы [ 7 ]

7 голосов
/ 27 января 2011

Использование FindBin и Cwd:

#!/usr/bin/env perl

use strict;
use warnings;

use Cwd        ();
use FindBin    ();
use File::Spec ();

my $full_path = File::Spec->catfile( $FindBin::Bin, $FindBin::Script );
my $executed_from_path = Cwd::getcwd();

print <<OUTPUT;
Full path to script: $full_path
Executed from path:  $executed_from_path
OUTPUT

Пример вывода (сценарий сохранен как /tmp/test.pl):

alanhaggai@love:/usr/share$ /tmp/test.pl 
Full path to script: /tmp/test.pl
Executed from path:  /usr/share
3 голосов
/ 26 января 2011
use File::Spec;

print File::Spec->rel2abs($0);

печатает полный путь к вашему сценарию, включая имя файла, как вы хотите.

2 голосов
/ 27 января 2011

Для решения, которое также обрабатывает символические ссылки,

use Cwd            qw( realpath );
use File::Basename qw( dirname );

# Look for modules in the same dir as the script.
use lib dirname(realpath($0));
2 голосов
/ 26 января 2011

Это доступно со встроенной переменной $ FindBin :: Bin (см. perldoc FindBin ):

use FindBin;
use File::Spec;

print "the location of my script is: ", $FindBin::Bin, "\n";
print "the basename of my script is: ", $FindBin::Script, "\n";
print "the full path (symlinks resolved) of my script is: ", File::Spec->catfile($FindBin::RealBin, $FindBin::RealScript), "\n";
2 голосов
/ 26 января 2011

переменная окружения PWD содержит текущий рабочий каталог, который должен быть путем, из которого был выполнен скрипт.

Вы можете получить полный путь к сценарию с помощью $ENV{PWD} и $0

Редактировать : предоставление примера кода, поскольку некоторым трудно поверить, что это возможно:

Возможно, я не поймал все возможные случаи, но это должно быть очень близко:

use strict;
use warnings;

print "PWD: $ENV{PWD}\n";
print "\$0: $0\n";

my $bin = $0;
my $bin_path;

$bin =~ s#^\./##; # removing leading ./ (if any)

# executed from working directory
if ($bin !~ m#^/|\.\./#) {
  $bin_path = "$ENV{PWD}/$bin";
}
# executed with full path name
elsif ($bin =~ m#^/#) {
  $bin_path = $0;
}
# executed from relative path
else {
  my @bin_path = split m#/#, $bin;
  my @full_path = split m#/#, $ENV{PWD};

  for (@bin_path) {
    next if $_ eq ".";
   ($_ eq "..") ? pop @full_path : push @full_path, $_;
  }
  $bin_path = join("/", @full_path);
}

print "Script Path: $bin_path\n";

Вывод из тестовых прогонов:

PWD: /tmp
$0: ../home/cmatheson/test.pl
Script Path: /home/cmatheson/test.pl

PWD: /home/cam
$0: ./test.pl
Script Path: /home/cam/test.pl

PWD: /usr/local
$0: /home/cam/test.pl
Script Path: /home/cam/test.pl

PWD: /home/cam/Desktop/foo
$0: ../../src/./git-1.7.3.2/../../test.pl
Script Path: /home/cam/test.pl
1 голос
/ 27 января 2011

Вы спрашивали о специальных материалах Perl, и никто не упомянул __FILE__.Проверьте perldata и многое другое.Я часто использую эту идиому, когда у меня есть соответствующее поддерево файлов / скриптов / модулей -

use Path::Class qw( file );
use File::Spec;

my $self_file = file( File::Spec->rel2abs(__FILE__) );
print
    " Full path: $self_file", $/,
    "Parent dir: ", $self_file->parent, $/,
    " Just name: ", $self_file->basename, $/;
0 голосов
/ 26 января 2011

Вы можете использовать модуль core Cwd, чтобы получить каталог, из которого был выполнен скрипт, и модуль core File::Spec, чтобы найти полный путь к скрипту.:

#!perl

use strict;
use warnings;
use Cwd;
use File::Spec;

my $dir = getcwd();
print "Dir: $dir\n";

print "Script: " . File::Spec->rel2abs($0) . "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...