我正在尝试将此命令作为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
任何人都可以帮忙。如果我单独运行命令它运行正常。
答案 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 ){
....