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