我正在尝试将此命令作为我的 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
任何人都可以请帮忙。如果我单独运行该命令,它运行良好。
这是一个脚本,它重现了与您看到的错误消息非常相似的内容:
#!/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
Konerak 上面所说的。
您可能应该在调用命令之前执行检查,如果您不需要保存命令的输出使用 system() 而不是反引号,它会使代码更加清晰。
if ($n1 ) {
system("mv $n1 ../out");
}
else{
die "No value assigned to \$n1 from previous routine routine_name()\n";
}
编辑
您可以更改检查以确保您尝试移动的结果存在并且是一个普通文件:即
if ( -f $n1 ){
....