Perl外部命令执行错误

时间:2011-04-28 20:12:43

标签: perl

我是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运行相同的程序,它就完美地执行了,没有错误。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

命令是否向标准输出写入任何内容(与标准错误相反)?反引号的返回值是程序的实际输出。如果输出为空,则$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";

答案 2 :(得分:1)

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

my $result = `$connectionString`;
my $rc = $? >> 8;
if( $rc ){
    die("Error executing command: $!\n");
}else{
    print "Success!\n";
}
return $result;

答案 3 :(得分:0)

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