Perl Scripting:将mv作为外部命令运行

时间:2012-01-19 09:16:26

标签: perl mv

我正在尝试将此命令作为perl脚本的一部分运行:

`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

任何人都可以帮忙。如果我单独运行命令它运行正常。

2 个答案:

答案 0 :(得分: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";

请注意

`...`

语法用于捕获shell命令的输出。由于您只是重命名文件,因此使用system

会更有意义
system 'mv', $n1, '../out';

或者,正如Quentin在评论中建议的那样,如果您确定没有跨文件系统边界移动文件,则使用File::Copy::move或内置rename函数。

答案 1 :(得分:0)

Konerak上面说了什么。

你应该在调用命令之前执行检查,如果你不需要保存命令的输出使用system()而不是返回ticks,它会使代码更加清晰。

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

修改
您可以更改检查以确保您尝试移动的结果存在并且是正常文件:即

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