2013-01-15 77 views
1

這是我的Perl代碼將結果移動到發送的文件夾。爲什麼我的perl系統命令不起作用?

system("mv /home/pi/downloads/$result /home/pi/downloads/sent/$result"); 

我得到的錯誤是:

mv: missing destination file operand after `/home/pi/downloads/filename.txt' 

我到底錯在這裏做什麼?

回答

4

這很難說,但有幾件事情可以幫助你解決問題。

首先確保你的腳本開始這樣的:

#!/pathe/to/perl -w 

use strict; 

通知的-w啓用警告。另外use strict將幫助您識別代碼問題。

另一件事,幫助了很多的存儲要在一個標量運行的命令,並打印出來,看看它究竟是幹什麼:

my $result = "filename.txt"; 
chomp($result); 
my $cmd = sprintf("mv /home/pi/downloads/%s /home/pi/downloads/sent/%s", $result, $result); 
print "$cmd\n"; 
system($cmd); 

在你的腳本,你得到$結果來自用戶輸入?我有一種感覺,它有一個換行符。 chomp函數將安全地從字符串末尾刪除換行符。

+0

這讓我在正確的軌道上。謝謝!我最終需要$ result =〜s/\ n // g; – BluGeni

+0

@BluGeni呃,糟糕的\ n'符號,討厭它在行末:\ – gaussblurinc

+0

請注意,使用這段代碼你永遠不會知道你的'mv'命令是否因任何原因失敗 - 比如缺少權限,錯誤的文件名等... – mvp

7

最有可能的$result包含一個換行符,它會過早地終止該命令。使用chomp放棄額外的換行符。

如果$result來自用戶輸入,並且沒有被裁切,那麼幾乎肯定會有一個換行符。而且,根據您程序的受衆,您現在有惡意代碼注入問題。

爲了避免注入問題,如何使用rename函數將文件移動到目的地?

1

檢查兩個$result和目錄本身:

  • 確保$result沒有斜槓在它(除非你希望子目錄)
  • 確保$result沒有空格因爲該命令不使用引號
  • 請確保$result不爲空

對於目錄:

  • 確保/home/pi/downloads存在且是一個目錄
  • 確保/home/pi/downloads/sent存在且是一個目錄
  • 確保/home/pi/downloads具有寫權限
  • 確保/home/pi/downloads/sent擁有可寫權限

3

雖然你可以調用外部程序到您使用system()qx{}的做一些事情,Perl是非常強大和靈活,併爲許多常見的操作就可以做到用剛剛Perl本身(或它的許多模塊),無使用任何外部。如果出現任何外部程序問題,它會更快更可靠。例如,如果外部可執行文件有問題並且處於緊密循環中,則system()可能永遠不會返回,從而凍結您的腳本。

在你的情況,這Perl代碼更好地工作和處理錯誤:

use File::Copy; 

unless (move ("/home/pi/downloads/$result", 
       "/home/pi/downloads/sent/$result")) 
{ 
    print "Rename has failed!\n"; 
    # ... 
} 

(當然,你應該確保$result不包含換行符運行此之前。)

+0

謝謝你,我會用這個代替我的代碼。 – BluGeni

+0

然後確保接受您實際使用的解決方案。 – mvp

相關問題