2015-01-26 53 views
0

我試圖下載幾個示例rails項目中列出的ruby gems,我通過bundle install下載了最新版本的ruby,通過RVM安裝,按照指示here正確下載捆綁器文件中列出的寶石。我想我會加快這個perl腳本的過程:(不太使用bash舒適又不失):perl:File :: Copy:在閱讀現有文件時沒有這樣的文件或目錄錯誤

#!/usr/bin/perl 
use File::Copy qq(copy); 

use strict; 
use warnings; 

my @files = `ls`; 
foreach my $dir (@files) 
{ 
    chomp $dir; 
    if(-d $dir) 
    { 
     print "\n\n\tabout to enter $dir\n\n\n"; 
     print `cd "$dir"`; 
     system("echo \"2.2.0\" > .ruby-version"); 
     system("echo \"$dir\" > .ruby-gemset"); 
     copy("Gemfile", "tmp.save") or die "copy: $!\n"; 
     open(RD,"<tmp.save") or die "$dir: tmp.save: $!\n"; 
     open(WR,">Gemfile") or die "$dir: Gemfile: $!\n"; 
     print WR <RD>; 
     print WR "\n"; 
     print WR "ruby \'2.2.0\'"; 
     print WR "\n\n"; 
     while(<RD>) { print WR $_; print WR "\n"; } 
     close(RD); close(WR); 
     print `cd ..`; 
     print `cd "$dir"`; 
     print `bundle install`; 
     print `cd ..`; 
    } 
} 

錯誤是:

copy: No such file or directory 

文件明顯存在這些項目大概有創建rails <name>命令。爲什麼會發生這種情況,我該如何解決?

回答

4

當您使用system或反引號調用外部命令時,會產生一個新進程。這一進程都有自己的環境,這是不與父進程或與其他孩子分享:

system('pwd'); # /foo 
system('cd "/bar"'); 
system('pwd'); # still /foo 

(請注意,如果你沒有實際存儲命令的輸出,這是最好使用system代替)

這意味着當你使用`cd "$dir"`時,你的Perl腳本的工作目錄不會改變。要修復,請使用本地Perl命令,而不是調用shell命令。

這裏有一個粗略的例子(未經測試):

use strict; 
use warnings; 

use File::Copy; 

my $parent_dir = 'foo'; 

opendir my $dh, $parent_dir or die "opendir failed on '$parent_dir': $!"; 

my @subdirs = map { "$parent_dir/$_" } 
       grep { $_ !~ /^\.\.?$/ && -d "$parent_dir/$_" } readdir $dh; 

foreach my $subdir (@subdirs) { 
    my $source = "$subdir/Gemfile"; 
    my $target = "$subdir/tmp.save"; 

    if (-f $source) { 
     copy $source, $target or die "copy failed: $!"; 
    } 
} 
相關問題