为什么我的perl系统命令不起作用?

时间:2013-01-15 00:17:42

标签: linux perl

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

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

我得到的错误是:

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

我在这里做错了什么?

4 个答案:

答案 0 :(得分:7)

最有可能$result包含一个换行符,该换行符会提前终止命令。使用chomp放弃额外的换行符。

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

为避免注入问题,如何使用rename函数将文件移动到目标位置?

答案 1 :(得分:4)

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

首先确保您的脚本以这样的方式启动:

#!/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函数将安全地从字符串末尾删除换行符。

答案 2 :(得分:3)

虽然您可以使用system()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不包含换行符。)

答案 3 :(得分:1)

检查$result和目录本身:

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

目录:

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