LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 971|回复: 1

【求助】关于Net::FTP和perl在shell下执行时的返回值

[复制链接]
发表于 2012-1-16 21:14:02 | 显示全部楼层 |阅读模式
关于perl的Net::FTP,假如以下的  
ftp->get($remotefile, $fhandle) 语句执行,
文件下载过程中发生了超时,perl程序自身会中断执行。结果如下:  

[代码片段]  
------------------------------------------  
my $ftp = Net::FTP->new($host);  
if (not $ftp) {  
  exit 3;  
}  
if (not $ftp->login($user, $passwd)) {  
  exit 3;  
}  
$ftp->binary();  
if ($remotedir ne "") {  
  if (not $ftp->cwd($remotedir)) {  
  $ftp->quit();  
  exit 3;  
  }  
}  
$ftp->hash(\*STDERR);  
if ($ftp->get($remotefile, $fhandle)) { ★  
  $ftp->quit();  
  exit 0;  
}  
------------------------------------------  

[执行例]  
------------------------------------------  
bash-3.2# ftpget.pl ftp://user:password@192.168.2.1/test.tgz test.tgz  
bash-3.2# Timeout at /usr/lib/perl5/5.8.8/Net/FTP.pm line 503  
bash-3.2# echo $?  
2 ★ perl程序的返回值是2?  
bash-3.2#  
------------------------------------------  

从代码上看,应该是read动作时发生了超时,  
在I.pm中通过croak函数返回.  
if ($size > length ${*$data} and !${*$data}{'net_ftp_eof'}) {  
$data->can_read($timeout)  
or croak "Timeout"; ★  

但有哪位大侠知道执行时的返回值2是在哪里设置的么?  
(试了在perl脚本里显式的执行croak函数,执行的返回值是255)
发表于 2012-1-29 15:56:47 | 显示全部楼层
Post by lelecool;2158812
关于perl的Net::FTP,假如以下的  
ftp->get($remotefile, $fhandle) 语句执行,
文件下载过程中发生了超时,perl程序自身会中断执行。结果如下:  

[代码片段]  
------------------------------------------  
my $ftp = Net::FTP->new($host);  
if (not $ftp) {  
  exit 3;  
}  
if (not $ftp->login($user, $passwd)) {  
  exit 3;  
}  
$ftp->binary();  
if ($remotedir ne "") {  
  if (not $ftp->cwd($remotedir)) {  
  $ftp->quit();  
  exit 3;  
  }  
}  
$ftp->hash(\*STDERR);  
if ($ftp->get($remotefile, $fhandle)) { ★  
  $ftp->quit();  
  exit 0;  
}  
------------------------------------------  

[执行例]  
------------------------------------------  
bash-3.2# ftpget.pl ftp://user:password@192.168.2.1/test.tgz test.tgz  
bash-3.2# Timeout at /usr/lib/perl5/5.8.8/Net/FTP.pm line 503  
bash-3.2# echo $?  
2 ★ perl程序的返回值是2?  
bash-3.2#  
------------------------------------------  

从代码上看,应该是read动作时发生了超时,  
在I.pm中通过croak函数返回.  
if ($size > length ${*$data} and !${*$data}{'net_ftp_eof'}) {  
$data->can_read($timeout)  
or croak "Timeout"; ★  

但有哪位大侠知道执行时的返回值2是在哪里设置的么?  
(试了在perl脚本里显式的执行croak函数,执行的返回值是255)


一个良好的编程习惯就是调用模块中的内容的时候同时有一个die
这样就可以知道是那步出错了,你的代码只有部分,看不出问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表