2012-11-20 63 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