실행중인 Perl 스크립트의 전체 경로는 어떻게 얻습니까? 실행 중에 스크립트의

Perl 스크립트가 있는데 실행 중에 스크립트의 전체 경로와 파일 이름을 결정해야합니다. 난 당신이 스크립트를 호출하는 방법에 따라하는 것을 발견 $0를 포함 때로는 다양하며 fullpath+filename때로는 단지 filename. 작업 디렉토리는 다양 할 수 있기 때문에 fullpath+filename스크립트 를 안정적으로 얻는 방법을 생각할 수 없습니다 .

누구든지 해결책을 얻었습니까?



답변

몇 가지 방법이 있습니다.

  • $0 스크립트가 CWD 이하인 경우 POSIX에서 제공하는 현재 실행중인 스크립트입니다.
  • 또한 cwd(), getcwd()abs_path()에 의해 제공되는 Cwd모듈과 스크립트에서 실행되는 위치를 알려
  • 이 모듈 FindBin일반적으로 실행 스크립트의 경로 인 $Bin& $RealBin변수를 제공합니다 . 이 모듈은 또한 스크립트 이름 인 & 를 제공합니다.$Script$RealScript
  • __FILE__ 컴파일 도중 전체 경로를 포함하여 Perl 인터프리터가 처리하는 실제 파일입니다.

첫 번째 세 개 ( $0, Cwd모듈 및 FindBin모듈)가 놀랍게 실패 하여 빈 문자열 mod_perl과 같은 가치없는 출력을 생성하는 것을 보았습니다 '.'. 그러한 환경에서는 모듈 __FILE__을 사용하여 경로를 사용하고 경로를 얻습니다 File::Basename.

use File::Basename;
my $dirname = dirname(__FILE__);

답변

$ 0은 일반적으로 프로그램의 이름입니다. 어떻습니까?

use Cwd 'abs_path';
print abs_path($0);

abs_path가 상대 경로 또는 절대 경로를 사용하고 있는지 알기 때문에 이것이 작동해야합니다.

업데이트 몇 년 후 읽은 사람이라면 Drew ‘s answer를 읽어야 합니다. 내 것보다 훨씬 낫다.


답변

Use File::Spec;
File::Spec->rel2abs( __FILE__ );

http://perldoc.perl.org/File/Spec/Unix.html


답변

찾고있는 모듈이 FindBin이라고 생각합니다.

#!/usr/bin/perl
use FindBin;

$0 = "stealth";
print "The actual path to this is: $FindBin::Bin/$FindBin::Script\n";

답변

당신은 사용할 수 FindBin , CWD , 파일 : 기본 이름 또는 이들의 조합. 그들은 모두 Perl IIRC의 기본 배포판에 있습니다.

나는 과거에 Cwd를 사용했다.

Cwd :

use Cwd qw(abs_path);
my $path = abs_path($0);
print "$path\n";

답변

$0또는 __FILE__원하는 경로를 얻는 것입니다. 누군가를 한 경우에만 문제는 chdir()하고는 $0당신이에 절대 경로를 얻을 필요가 – 친척 BEGIN{}어떤 놀라움을 방지 할 수 있습니다.

FindBin에서 $PATH일치하는 무언가를 위해 더 잘되고 그루브를 시도 basename($0)하지만, 너무 놀라운 일을하는 경우가 있습니다 (특히 : 파일이 cwd에서 “바로 앞에 있음”).

File::FuFile::Fu->program_nameFile::Fu->program_dir이에 대한.


답변

일부 짧은 배경 :

불행히도 Unix API는 실행 파일에 대한 전체 경로를 가진 실행중인 프로그램을 제공하지 않습니다. 실제로, 당신을 실행하는 프로그램은 일반적으로 프로그램이 무엇인지 알려주는 필드에서 원하는 것을 제공 할 수 있습니다. 모든 답변에서 알 수 있듯이, 가능한 후보를 찾기위한 다양한 휴리스틱이 있습니다. 그러나 전체 파일 시스템을 검색하는 데 항상 부족한 것은 없으며 실행 파일을 이동하거나 제거해도 실패합니다.

그러나 실제로 실행중인 Perl 실행 파일은 원하지 않지만 실행중인 스크립트는 원하지 않습니다. 그리고 Perl은 스크립트가 어디에 있는지 알아야합니다. 유닉스 API에서 온 __FILE__동안 이것을에 저장합니다 $0. 이것은 여전히 ​​상대 경로 일 수 있으므로 Mark의 제안을 받아이를 표준화하십시오.File::Spec->rel2abs( __FILE__ );