0

我想就检查 shell 脚本的错误发表意见。我支持的系统包含一个由另一个应用程序(java)多次运行的简单 shell 脚本。java调用一个shell脚本,执行ftp连接打开,移动本地目录,mget命令,最后是一个再见命令。然后它检查 $? 在再见命令之后。

我知道首先这段代码是可疑的,因为它应该只检查 bye 命令,但它会间歇性地导致错误。我已经要求 UNIX 管理员查看系统中是否存在日志错误,但他们说没有。

基本上脚本的一般结构是:

sftp -oPort=<port forwarding port> <ip and user> <<==
lcd <some variable>
mget <some variable>
bye

rtn=$?
if [ ${rtn} != 0 ]
then
        exit 1
fi

exit 0

任何想法为什么$?有时返回非零?

4

1 回答 1

3

非零退出代码的原因:

  1. lcd 命令失败,您处于批处理模式
  2. mget 命令失败(glob 不起作用)并且您处于批处理模式
  3. 再见命令失败(低概率)并且您处于批处理模式
  4. 远程端没有 sftp 服务器(退出代码 == 255)

如果你想故意忽略正在使用的命令的错误,那么你可以在命令前面加上-eg mgetbecome-mget

尝试调试时要做的一件重要事情是捕获命令的输出并在命令失败时转储它,例如

trap 'rm -f /tmp/logfile.$$' EXIT HUP
sftp -oPort=<port forwarding port> <ip and user> >&/tmp/logfile.$$ <<EOM
lcd <some variable>
mget <some variable>
bye
EOM
rtn=$?
if ((rtn != 0)); then
    cat /tmp/logfile.$$
    exit 1
fi
exit 0

trap脚本终止时删除文件。

于 2012-10-01T09:57:09.150 回答