2012-12-26 208 views
1

我需要運行一個系統命令,它將轉到一個目錄並刪除不包含文件的子目錄(如果存在)。我寫了下面的命令來執行這個操作:perl中的系統命令

system("cd /home/faizan/test/cache ; for i in *\; do if [ -d \"$i\" ]\; then echo \$i fi done"); 

上面的命令一直拋出語法錯誤。我嘗試了多種組合,但仍不清楚應該如何去做。請建議。

+0

有什麼錯誤? –

+0

錯誤:sh:-c:第1行:語法錯誤:文件意外結束 –

+0

爲什麼不單獨創建一個bash文件,然後從Perl程序中調用它? –

回答

6

那麼,你的命令行確實包含語法錯誤。試試這個:

system("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done"); 

或者更好的是,只在第一個地方循環目錄;

system("for i in /home/faizan/test/cache/*/.; do echo \$i; done"); 

或者更好的是,這樣做沒有環:

system("echo /home/faizan/test/cache/*/."); 

(我想你會想rmdir而不是echo一旦正確調試)

或者更好的是,用Perl做這一切。這裏沒有什麼需要system()

+0

謝謝你..你的建議工作..我會嘗試在perl –

1

由於問題的標題代表system命令,這將直接回答,而是使用bash樣本命令只包含將在Perl被simplier只(以使用opendir-d在Perl看看其他的答案)的事情。

如果你想使用(而不是open $cmdHandle,"bash -c ... |"system,要執行的首選語法命令,如systemexec,就是讓perl解析命令行。

試試這個(因爲你已經做了):

perl -e 'system("bash -c \"echo hello world\"")' 
hello world 

perl -e 'system "bash -c \"echo hello world\"";' 
hello world 

現在更好,同樣而是讓perl確保在命令行解析,試試這個:

perl -e 'system "bash","-c","echo hello world";' 
hello world 

顯然有3爭論system命令的:

  1. 的bash
  2. -c
  3. 腳本

或更多一點:

perl -e 'system "bash","-c","echo hello world;date +\"Now it is %T\";";' 
hello world 
Now it is 11:43:44 

,你可以在最後的目的看,有沒有雙雙引號包圍命令bash腳本部分線。

**注意:在命令行上,使用perl -e '...'perl -e "...",使用引號和雙引號會有點沉重。在腳本中,你可以將它們混合:

system 'bash','-c','for ((i=10;i--;));do printf "Number: %2d\n" $i;done'; 

甚至:

system 'bash','-c','for ((i=10;i--;));do'."\n". 
         'printf "Number: %2d\n" $i'."\n". 
         'done'; 

使用點.concatening(腳本部分)字符串的一部分,總有3個參數。

1

你還是最好先把它作爲bash命令。格式化,妥善使得它更加清晰,你缺失的語句結束:

for i in *; do 
    if [ -d "$i" ]; then 
     echo $i 
    fi 
done 

和冷凝,通過(從do/then後開),用分號替換新行:

for i in *; do if [ -d "$i" ]; then echo $i; fi; done 

或者爲有已經提到,只是在Perl中做的(我沒有測試過這個實際上取消註釋remove_tree - 要小心!):

use strict; 
use warnings; 

use File::Path 'remove_tree'; 
use feature 'say'; 

chdir '/tmp'; 
opendir my $cache, '.'; 
while (my $item = readdir($cache)) { 
    if ($item !~ /^\.\.?$/ && -d $item) { 
     say "Deleting '$item'..."; 
     # remove_tree($item); 
    } 
} 
+0

實施這個謝謝你的好解釋。問題是隻有一臺服務器安裝了perl,而其他服務器不需要在這裏執行。我需要ssh到那些使用Perl的服務器,然後執行一個sh腳本或類似於上面的東西。 –

1

使用系統

my @args = ("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done"); 
system(@args); 

使用子程序

sub do_stuff { 
    my @args = ("bash", "-c", shift); 
    system(@args); 
} 

do_stuff("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done"); 
+0

sub真的很酷..謝謝 –