【问题标题】:how to check for an external shell script exit code如何检查外部 shell 脚本退出代码
【发布时间】:2012-11-20 18:45:41
【问题描述】:

我有一个简单的“主”shell 脚本,它会做一些准备工作,然后调用另一个将文件上传到 ftp 站点的 shell 脚本。我想知道如何等待并检查被调用 shell 脚本的退出代码,以及如何轻松检查 FTP 文件是否实际成功上传并提供正确的退出代码(0 或 1)

谢谢

主脚本:

#!/bin/sh
# check for build tools first
FTP_UPLOAD_SCRIPT=~/Desktop/ftp_upload.sh

if [ -f "$FTP_UPLOAD_SCRIPT" ]; then
    echo "OK 3/5 ftp_upload.sh found. Execution may continue"
else
    echo "ERROR ftp_upload.sh not found at $FTP_UPLOAD_SCRIPT. Execution cannot continue."
exit 1
fi

  # upload the packaged installer to an ftp site
  sh $FTP_UPLOAD_SCRIPT

  # check the ftp upload for its exit status
  ftp_exit_code=$?
  if [[ $ftp_exit_code != 0 ]] ; then
    echo "FTP ERRORED"
    exit $ftp_exit_code
  else
    echo $ftp_exit_code
    echo "FTP WENT FINE"
  fi

  echo "\n"
  exit 0

ftp_upload_script:

#!/bin/sh
FTP_HOST='myhost'
FTP_USER='myun'
FTP_PASS='mypass'

FTPLOGFILE=logs/ftplog.log
LOCAL_FILE='local_file'
REMOTE_FILE='remote_file'

ftp -n -v $FTP_HOST <<SCRIPT >> ${FTPLOGFILE} 2>&1
quote USER $FTP_USER
quote PASS $FTP_PASS
binary
prompt off
put $LOCAL_FILE $REMOTE_FILE
bye
SCRIPT
echo $!

【问题讨论】:

  • echo $! 这样你就可以从 ftp 命令输出返回值,而不仅仅是 0?
  • ftp_upload_script 坏了!它总是退出0,表示它成功了。把exit 0去掉就行了,它会返回ftp的退出状态,如果不上传文件估计会失败。 (我已经好几年没用ftp了,也不知道它是否可靠地报告了它的状态。改用scp。)
  • 我尝试输出 echo $!但它返回(afaict)0,即使 fpt 脚本无法连接到主机(我已经更改了主机 IP,所以它不能)。我正在使用 ftp_exit_code=$?然后在主脚本中使用 exit $ftp_exit_code 打印它。我已更新上述脚本以纳入您的建议。 ....不幸的是,我不允许使用 scp(不是我的决定)
  • 由于echo $!成功(即使没有后台PID上报),脚本的退出状态为0,与echo的退出状态相同。跨度>

标签: bash shell ftp


【解决方案1】:

我认为您正在寻找的是 exit $? 而不是 FTP 脚本底部的 echo $!

使用echo 只会打印到stdout,但不会返回退出代码(因此应该使用exit)。特殊的$?是前一个进程的返回码,而不是$!,是进程ID。

【讨论】:

  • 请注意,shell 以最后执行命令的状态退出。您也可以使用exec ftp ... 将shell 脚本替换为FTP 命令,这样就可以保证获得FTP 的退出状态。我对 FTP 的经验是,无论出了什么问题,它都会返回 0(成功),因此无论如何测试结果并没有多大帮助,但对于命令退出状态相关的一般情况,其中任何一个(exec 或简单退出)会有所帮助。
  • 是的,这就是我注意到的(即使出现错误也始终为 0)。这就是为什么我在上传后立即添加了下载仔细检查测试。我认为这是一个有效的测试来确认您的文件实际上是首先上传的。
【解决方案2】:

我想出了一个解决方案,它既可以仔细检查 ftp 上传,又可以提供适当的退出代码。

... ftp upload first ... then ...

# this is FTP download double-check test
ftp -n -v $FTP_HOST <<SCRIPT >> ${FTPLOGFILE} 2>&1
quote USER $FTP_USER
quote PASS $FTP_PASS
binary
prompt off
get $REMOTE_FILE $TEST_FILE
bye
SCRIPT

#check to see if the FTP download test succeeded and return appropriate exit code
if [ -f "$TEST_FILE" ]; then
  echo "... OK FTP download test went fine. Execution may continue"
  exit 0
else
  echo "... ERROR FTP download test failed. Execution cannot continue"
  exit 1
fi

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 2013-01-26
    • 2021-12-09
    • 2013-08-28
    • 2010-11-27
    • 1970-01-01
    • 2011-11-26
    • 2010-12-16
    • 1970-01-01
    相关资源
    最近更新 更多