次の 2 つの情報を取得する方法を探しています。
- ファイル名を含む、スクリプトが存在する場所のフル パス
- スクリプトが実行された場所のフル パス
ファイル名を取得するために使用できることは知っていますが$0
、私が探しているものを提供する Perl 固有の予約済み変数は他にありますか?
特別なモジュールを使用したくないのですが、それが唯一の方法である場合は、そうしてください。
次の 2 つの情報を取得する方法を探しています。
ファイル名を取得するために使用できることは知っていますが$0
、私が探しているものを提供する Perl 固有の予約済み変数は他にありますか?
特別なモジュールを使用したくないのですが、それが唯一の方法である場合は、そうしてください。
#!/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
use File::Spec;
print File::Spec->rel2abs($0);
必要に応じて、ファイル名を含むスクリプトへのフルパスを出力します。
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
シンボリックリンクも処理するソリューションの場合、
use Cwd qw( realpath );
use File::Basename qw( dirname );
# Look for modules in the same dir as the script.
use lib dirname(realpath($0));
これは組み込みの $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";
あなたは特別な Perl について尋ねましたが、誰も言及していません__FILE__
。perldataなどをチェックしてください。関連するファイル/スクリプト/モジュールのサブツリーがある場合、このイディオムをよく使用します–</p>
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, $/;
コア モジュールを使用しCwd
てスクリプトが実行されたディレクトリを取得し、コア モジュールを使用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";