這是我的Perl代碼將結果移動到發送的文件夾。爲什麼我的perl系統命令不起作用?
system("mv /home/pi/downloads/$result /home/pi/downloads/sent/$result");
我得到的錯誤是:
mv: missing destination file operand after `/home/pi/downloads/filename.txt'
我到底錯在這裏做什麼?
這是我的Perl代碼將結果移動到發送的文件夾。爲什麼我的perl系統命令不起作用?
system("mv /home/pi/downloads/$result /home/pi/downloads/sent/$result");
我得到的錯誤是:
mv: missing destination file operand after `/home/pi/downloads/filename.txt'
我到底錯在這裏做什麼?
這很難說,但有幾件事情可以幫助你解決問題。
首先確保你的腳本開始這樣的:
#!/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函數將安全地從字符串末尾刪除換行符。
最有可能的$result
包含一個換行符,它會過早地終止該命令。使用chomp
放棄額外的換行符。
如果$result
來自用戶輸入,並且沒有被裁切,那麼幾乎肯定會有一個換行符。而且,根據您程序的受衆,您現在有惡意代碼注入問題。
爲了避免注入問題,如何使用rename
函數將文件移動到目的地?
檢查兩個$result
和目錄本身:
$result
沒有斜槓在它(除非你希望子目錄)$result
沒有空格因爲該命令不使用引號$result
不爲空對於目錄:
/home/pi/downloads
存在且是一個目錄/home/pi/downloads/sent
存在且是一個目錄/home/pi/downloads
具有寫權限/home/pi/downloads/sent
擁有可寫權限雖然你可以調用外部程序到您使用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
不包含換行符運行此之前。)
這讓我在正確的軌道上。謝謝!我最終需要$ result =〜s/\ n // g; – BluGeni
@BluGeni呃,糟糕的\ n'符號,討厭它在行末:\ – gaussblurinc
請注意,使用這段代碼你永遠不會知道你的'mv'命令是否因任何原因失敗 - 比如缺少權限,錯誤的文件名等... – mvp