0

我正在尝试将此命令作为我的 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

任何人都可以请帮忙。如果我单独运行该命令,它运行良好。

4

2 回答 2

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

于 2012-01-19T11:04:50.300 回答
0

Konerak 上面所说的。

您可能应该在调用命令之前执行检查,如果您不需要保存命令的输出使用 system() 而不是反引号,它会使代码更加清晰。

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

编辑
您可以更改检查以确保您尝试移动的结果存在并且是一个普通文件:即

if ( -f $n1 ){
....
于 2012-01-19T10:13:34.580 回答