2016-12-23 1 views
7

많은 동료들이 BEGIN 블록에서 다음 명령을 사용합니다. 나는 주위를 둘러 보았다하고 도울 수 없어요하지만디렉토리로 변경 한 다음 getcwd()

$scriptDir = dirname($0); 
chdir($scriptDir); 
$scriptDir = getcwd(); 

는 세 번째 줄 즉 $scriptDir = getcwd(); 중복이라고 생각합니다. 우리가 이미 $scriptDir = dirname($0);에서 scriptdir을 가지고 있기 때문에. 내가 여기에 뭔가 빠져 있니?

+0

아래와 같이, FindBin qw ($ RealBin);을 사용하고 디렉토리를 변경하지 마십시오. '@ ARGV '에 나열된 파일은'$ RealBin'이 아니라'pwd'에 상대적입니다. – shawnhcorey

답변

7

dirname($0)Chankey PathakMatthias 가 보여으로, 전체 경로를 반환하지 않습니다 그러나 scrip.pl이 경로에서 발견되면 아무런 차이가 없다.

다른 방법이 있다는 것을 추가하고 싶습니다. 예를 들어,

use FindBin qw($RealBin); 

BEGIN: { 
    my ($scriptDir) = $RealBin; 
    chdir $scriptDir    or die "Can't change to $scriptDir: $!"; 
}; 

$RealBin

는 해결 링크의 전체 경로입니다 것을 제외하고, 당신이 보여주는 것과 같은 제공 FindBin (또한 코어)를 사용할 수 있습니다.

chdir은 설명에 대해 ikegami으로 인해 실패 할 수 있습니다. 이 경우 false가 반환되고 위의 코드가 적합하면 적절하게 조정됩니다. 질문 된 세 번째 줄은 이것과 아무런 관련이 없음을 주목하십시오.

이 모듈은 또한 일반적으로 아마 모두 사용하는 경우에도 쉽게 결정을 만드는 것, 예

use lib "$RealBin/../lib"; 

를 들어, lib 프라 그마와 함께 도서관에 상대 경로에 사용됩니다. 이 함수는, UNIX 쉘 명령 dirname(1)과의 호환성을 위해 제공되며, 그 단점들을 계승

( 광산하지 강조 ) File::Basename에서 dirname 설명하면 다음과 같다


더욱.그 이름에도 불구하고 NOT 항상 예상대로 디렉토리 이름을 반환합니다. 안전을 기하기 위해 경로의 디렉토리 이름을 원하면 fileparse()을 사용하십시오.

내가 아니라도 abs_path 전체 경로를 제공하지 않을 수 자체 __FILE__부터 사용되어

use Cwd qw(abs_path); 

BEGIN: { 
    my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|; 
    chdir $scriptDir    
     or die "Can't change to $scriptDir: $!"; 
}; 

와 함께 갈 것입니다. 정규식은 모든 것을 마지막으로 /까지, 즉 스크립트 디렉토리의 전체 경로까지 훑어 봅니다.

4
  • getcwd - 현재 작업 디렉토리
  • chdir에게 반환 - 예를 아래

이 잘 설명 EXPR하는 작업 디렉토리를 변경합니다.

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::Basename; 
use Cwd; 

my $scriptDir = dirname($0); 
chdir($scriptDir); 
print "First: $scriptDir\n"; 
$scriptDir = getcwd(); 
print "Second: $scriptDir\n"; 

출력 :

[email protected]:~/Desktop$ perl test.pl 
First: . 
Second: /home/chankeypathak/Desktop 
0

나는 다음 펄 상인 아니지만, 난 당신이 조금 스크립트로 준 코드를 실행하는 것을 시도했다 :

#!/usr/bin/perl 
# 

use strict; 
use File::Basename; 
use Cwd; 

BEGIN { 
    my $scriptDir = dirname($0); 
    print "scriptDir = $scriptDir\r\n"; 
    chdir($scriptDir); 
    $scriptDir = getcwd(); 
    print "scriptDir = $scriptDir\r\n"; 
} 

을 그리고 이것은 무엇이다 나왔다 :

[email protected]:~/perltest> ./script.pl 
scriptDir = . 
scriptDir = /home/map/perltest 
[email protected]:~/perltest> 

It lo dirname과 getcwd가이 경우에 차이를 만드는 것처럼 oks.

[email protected]:~> cp script.pl ~/bin 
[email protected]:~> cd 
[email protected]:~> script.pl 
scriptDir = /home/map/bin 
scriptDir = /home/map/bin 
[email protected]:~> rm ~/bin 
관련 문제