【问题标题】:Perl external command execution errorPerl外部命令执行错误
【发布时间】:2011-08-15 00:39:42
【问题描述】:

我是 perl 新手,正在尝试使用 LFTP 程序创建 FTP 脚本。

我正在尝试通过 LFTP 执行 FTP 脚本文件。我的代码是:

my $CLIENT = "lftp";
my $connectionString =  "" . $CLIENT . " -d -f script.ftp";
my $result = `$connectionString` or die "\nERROR running $CLIENT: $!";
return $result;

好吧,它完美地执行了 script.ftp 文件中的所有命令,因为调试已打开以查看输出,然后就死了,没有任何东西写入 $result。

我收到的错误是 -

ERROR running lftp: at ftp.pl line 3.

它指的是我将输出传递给变量$result的行。

任何线索为什么它没有将输出传递给$result 而只是死掉?

如果我从 Linux shell 运行相同的程序,它会完美执行,没有错误。

【问题讨论】:

标签: perl


【解决方案1】:

最好使用 FTP 模块(例如 Net::FTP),而不是依赖 shell / 外部命令。

【讨论】:

  • 使用LFTP的原因是为了FTPSSL和SFTP。
  • 那么 Net::SFTP 或 Net::FTPSSL 呢??
  • 我知道我可以使用它们。但是,想法是将此客户端用于单个函数中的所有 FTP 连接类型,只需传递加密方法和端口,而不是为不同的加密类型编写不同的函数。
【解决方案2】:

这并不是真正的错误,您只是将其定义为错误。系统调用的返回值被 perl 解释为 false,从而触发 die 子句。

【讨论】:

  • 这不是系统调用,而是对系统的调用。 :) 无论如何, false 是空字符串或零。想知道它是什么? :)
  • 空字符串,零或 undef,而是。我猜不出来,但如果我是他,我会检查返回值。
  • 好吧,我不了解你,但我认为 $x = undef、$x = "" 和 $x = 0 之间是有区别的。
  • 那你最好也加上(1 == 0)。疯狂何时结束? false 是空字符串或零:降压停在那里。
【解决方案3】:

该命令是否将任何内容写入标准输出(与标准错误相反)?反引号的返回值是程序的实际输出。如果输出为空,则 $result 的值为“false”,您的 die 语句将被调用。

一些替代方案:

使用system,因为system的返回值告诉你命令是否成功:

system($connectionString) and die "ERROR: running $CLIENT: $?\n"

system("$connectionString > $logFile 2>&1") 
    and die "ERROR in $CLIENT: $?. Look in $logFile\n";

(我们使用and 而不是or,因为与大多数其他函数不同,system 的返回值为零表示成功)。

另一种选择是加入外部命令的标准输出和标准错误,这样命令在唯一的输出是“错误”输出时成功,例如调试消息:

$result = `$connectionString 2>&1` or die "ERROR: running CLIENT: $!\n";


(根据大众需求编辑)另一种选择是以$?(上一次外部命令运行的退出状态)为条件:

$result = `$connectionString`;
$? == 0  or  die "ERROR: running CLIENT: $! $?\n";

【讨论】:

  • 非常感谢。好吧,如果我运行 system() 函数,它可以完美运行,没有任何错误消息。但是,我需要保存输出日志以生成报告。有什么想法吗?
  • 像原来一样使用反引号运行它以存储命令的输出,但随后检查 $? 特殊变量以获取指示失败或成功的实际返回代码。
【解决方案4】:

执行系统命令和检查错误的正确方法如下:

我的 $result = `$connectionString`; 我的 $rc = $? >> 8; 如果($rc){ die("执行命令出错:$!\n"); }别的{ 打印“成功!\n”; } 返回$结果;

【讨论】:

  • 这是 Perl,所以正确的说法是“A proper way ...”
  • 如果我检查错误,它会返回成功。但是,没有任何东西传递给 $result。有什么想法吗??
  • 你的命令是否真的产生任何输出到 STDOUT?如果你从命令行运行你的命令,最后是 '2> /dev/null' 会发生什么?如果您在命令行上没有得到任何输出,那么您的 perl 程序也不会在 $result 中得到任何结果。
猜你喜欢
  • 2013-04-16
  • 1970-01-01
  • 2011-05-05
  • 2013-05-08
  • 2011-04-25
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多