2012-11-20 65 views
0

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

谢谢

主要脚本:

#!/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 $! 
+0

'echo $!'所以你输出的是ftp命令的返回值,而不是0吗? –

+0

'ftp_upload_script'坏了!它始终退出0,表示成功。只要删除'exit 0',它就会返回'ftp'的退出状态,如果它没有上传文件,可能会失败。 (我多年没用过'ftp',不知道它是否可靠地报告它的状态,用'scp'代替) –

+0

我试过输出echo $!但它返回(afaict)0,即使fpt脚本无法连接到主机(我已更改主机IP,因此它不能)。我正在用ftp_exit_code = $读取退出值?然后使用主脚本中的退出$ ftp_exit_code打印它。我已经更新了上面的脚本以合并您的建议。 ....我不允许使用scp(不是我的决定) – TrekOnTV2017

回答

0

我已经想出了一个解决方案,双重检查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 
3

我想你要寻找的是exit $?而不是FTP脚本底部的echo $!

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

+0

请注意,shell以执行的最后一个命令的状态退出。您还可以使用'exec ftp ...'将FTP脚本替换为shell脚本,然后确保获得FTP的退出状态。我对FTP的使用经验是,无论出现什么问题,它都会返回0(成功),因此,对结果进行测试并没有多大帮助,但对于命令退出状态是相关的一般情况,无论是这两种方法退出)将有所帮助。 –

+0

是的,这就是我注意到的(即使在出错后也总是为0)。这就是为什么我上传后立即添加了下载双重检查测试。我认为这是一个有效的测试,以确认您的文件实际上被首先上传。 – TrekOnTV2017