2012-01-19 82 views
0

我想爲我的Perl腳本的一部分運行此命令:的Perl腳本:運行MV的外部命令

`mv $n1 ../out` 

其中$ N1是一個文件名,我從以前的子程序得到我。 我收到的錯誤如下:

mv: missing destination file operand after `test.pl' 
Try `mv --help' for more information. 
sh: line 1: ../out: is a directory 

任何人都可以請幫忙。如果我單獨運行命令它運行良好。

+4

當['File :: Copy :: move'](https://metacpan.org/module/File::Copy)存在時,爲什麼要拋出'mv'? – Quentin

+5

你確定'$ n1'被填滿嗎?看起來你正在執行'mv ../ out',因爲'$ n1'是空的。 – Konerak

+0

我可以向你保證$ n1已滿。我也在mv命令之前打印它。 $ n1必須是一些特殊的引號? –

回答

0

Konerak上面說的。

您應該在調用命令之前執行一次檢查,如果您不需要保存命令use system()的輸出而不是back tick,它會使代碼更清晰易讀。

if ($n1) { 
    system("mv $n1 ../out"); 
} 
else{ 
    die "No value assigned to \$n1 from previous routine routine_name()\n"; 
} 

編輯
你可以改變的檢查,以確保您試圖移動的結果存在,並且是一個正常的文件:即

if (-f $n1){ 
.... 
+0

,得到了相同的結果。只是讓你知道在CYGWIN上運行這段代碼。 –

+0

你能告訴我們$ n1包含什麼嗎? (一個空格?) – choroba

+0

$ n1會像test.sh.它已被刪除。 –

3

這裏的再現非常類似的腳本到您看到的錯誤消息:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $n1 = "test.pl\n"; 

`mv $n1 ../out`; 

問題是,$n以新行結束(也許你從文件中讀取它並沒有chomp嗎?),所以由shell執行的命令是:

mv test.pl 
../out 

如果這確實是問題,你可以跟蹤了它向下通過印刷的$n1值:

print "DEBUG: \$n1 = \"$n1\"\n"; 

注意,

`...` 

語法旨在捕獲外殼命令的輸出。因爲你只是重命名文件,它會更有意義使用system

system 'mv', $n1, '../out'; 

,或者如昆汀在評論所說,使用File::Copy::move,或內置rename功能,如果你確定你不會跨文件系統邊界移動文件。

+0

該文件是肯定的... 打印「輸入您的文件的名稱:」; chomp($ file_name = ); –

+0

當我使用你的系統命令時,我得到這個錯誤: mv:can stat'':沒有這樣的文件或目錄 –

+0

'$ file_name' ne'$ n1';在你的問題中顯示實際的代碼,不重寫... – pavel