Получение абсолютного пути к исполняемому файлу perl для текущего процесса
Есть ли способ получить абсолютный путь к исполняемому файлу Perl для текущего процесса?
$ ^ X даст мне имя исполняемого файла Perl, но в документе говорится, что иногда это будет относительный путь, и это, похоже, верно для OS X, например.
ExtUtils:: MakeMaker, похоже, обладает магией, чтобы найти абсолютный путь, так как Makefile, который он генерирует на моей OS X, содержит
PERL = /usr/local/bin/perl
FULLPERL = /usr/local/bin/perl
но я понятия не имею, как это происходит или магия легко доступна другим.
РЕДАКТИРОВАТЬ: Спасибо Бородин за $Config{perlpath}
совет. Разбираясь с этим в ExtUtils, я нашел этот кусок в ExtUtils::MM_Unix::_fixin_replace_shebang, который, как я полагаю, используется MakeMaker для замены #! Perl на правильную строку shebang.
if ($ Config {startperl} = ~ m, ^ \ #!. * / perl,) { $ интерпретатор = $Config{startperl}; $ интерпретатор =~ s,^\#!,,; } еще { $ интерпретатор = $Config{perlpath}; }
3 ответа
Я думаю, что вы ищете $Config{perlpath}
,
Если вы хотите, чтобы ваш код был очень переносимым, вам, возможно, придется добавить тип файла к этому значению; это описано в perlport
документация. В противном случае все, что вам нужно, это:
use Config;
my $perl = $Config{perlpath};
Вы можете получить его через основной модуль Config.
use Config;
say $Config{perl5}; # current perl binary
Я думаю, что всегда должен быть абсолютный путь, но я не могу этого гарантировать.
Perl включает основной модуль File::Spec, который может преобразовывать относительные пути в абсолютные.
my $full_path_to_perl = File::Spec->rel2abs($^X);
Для perl6 (raku): $*EXECUTABLE-NAME
содержит полный путь к запущенному в данный момент интерпретатору Raku (например, sys.executable
для Python)
Чтобы получить полную командную строку:
say ($*EXECUTABLE-NAME, $*PROGRAM-NAME, |@*ARGS).join(' ');
Подробнее в документации по переменным