1

这是我将结果移动到已发送文件夹的 perl 代码。

 system("mv /home/pi/downloads/$result /home/pi/downloads/sent/$result");

我得到的错误是:

mv: missing destination file operand after `/home/pi/downloads/filename.txt'

我在这里做错了什么?

4

4 回答 4

8

很可能$result包含一个换行符,它会提前终止命令。用于chomp丢弃额外的换行符。

如果$result来自用户输入并且没有被压缩,则几乎可以肯定有一个换行符。而且,根据您的程序的受众,您现在遇到了恶意代码注入问题。

为了避免注入问题,使用rename函数将文件移动到目的地怎么样?

于 2013-01-15T00:29:46.053 回答
5

这很难说,但你可以做一些事情来帮助你解决它。

首先确保你的脚本是这样开始的:

#!/pathe/to/perl -w

use strict;

注意 -w 以启用警告。还将use strict帮助您识别代码问题。

另一件很有帮助的事情是将要运行的命令存储在标量中并打印它以查看它实际在做什么:

my $result = "filename.txt";
chomp($result);
my $cmd = sprintf("mv /home/pi/downloads/%s /home/pi/downloads/sent/%s", $result, $result);
print "$cmd\n";
system($cmd);

在您的脚本中,您是否从用户输入中获得 $result 的值?我觉得它有一个换行符。chomp 函数将安全地从字符串末尾删除换行符。

于 2013-01-15T00:25:29.110 回答
3

system()虽然您可以使用or调用外部程序为您做某事qx{},但 Perl 非常强大且用途广泛,对于许多常见操作,只需使用 Perl 本身(或其众多模块)即可完成,而无需使用任何外部工具。如果外部程序出现任何问题,它会更快更可靠。例如,如果外部可执行文件有错误并且在紧密循环中旋转,system()则可能永远不会返回,从而冻结您的脚本。

在您的情况下,此 Perl 代码工作得更好并处理错误:

use File::Copy;

unless (move ("/home/pi/downloads/$result",
              "/home/pi/downloads/sent/$result"))
{
    print "Rename has failed!\n";
    # ...
}

(当然,在运行它之前,您应该确保它$result不包含换行符。)

于 2013-01-15T02:35:09.527 回答
1

检查两者$result和目录本身:

  • 确保其中$result没有斜杠(除非您期望子目录)
  • 确保其中$result没有空格,因为该命令不使用引号
  • 确保$result不为空

对于目录:

  • 确保/home/pi/downloads存在并且是一个目录
  • 确保/home/pi/downloads/sent存在并且是一个目录
  • 确保/home/pi/downloads具有可写权限
  • 确保/home/pi/downloads/sent具有可写权限

于 2013-01-15T00:30:42.450 回答