2014-06-16 98 views
1

我有下面的代碼..的Linux腳本錯誤返回代碼

while read copy 
do 
    cp -v $copy | tee -a $LOGFILE 
    echo $? 
    if [[ $? -ne 0 ]] 
     then 
     echo "Error copying files. Exiting ..." | tee -a $LOGFILE 
     exit 1 
    fi 

done < copy_new_files.tmp 

..我想腳本停止,如果一個文件不能被複制的錯誤,如拒絕的權限。

從腳本的輸出不產生對被拒絕的錯誤權限錯誤代碼..

+ read copy 
+ cp -v acts035.fmt /home/test/gp/efin/source/pl/acts035.fmt 
cp: cannot create regular file `/home/test/gp/efin/source/pl/acts035.fmt': Permission denied 
+ tee -a /home/test/gp/efin/fixes/12345/efin_fix_copy_12345.log 
`acts035.fmt' -> `/home/test/gp/efin/source/pl/acts035.fmt' 
+ echo 0 
0 

我怎樣才能拿到劇本暫停,如果有一個錯誤?

非常感謝。

+0

這'權限denied'提示你沒有權限在日誌文件中寫入。 – fedorqui

+1

使用'$?'兩次看起來很可疑。 'echo $?'改變它。也許你應該在使用它之前存儲這個值。 – andrjas

+1

如果您需要在交互式模式下的暫停這足以寫的,而不是'出口1'像'讀ppppp'線。當你想要前進時按回車 – Hastur

回答

3

有些陰險的小東西,我希望不會過長:

  • 第一個問題是,$?返回上次退出錯誤代碼
    因此,當您在以下行中執行echo $?時,您將$?設置爲新值,0在這種情況下:我看不到任何原因,echo命令必須失敗。

  • 第二個更隱患的問題是先例命令是管道。所以要使用的變量是${PIPESTATUS[0]}而不是$?。 (有[0],因爲它是一個數組,我們希望存儲在第一個組件中的值是第一個命令的退出狀態)。
    您可以再次將變量存儲在此值中,或者您可以在測試後立即執行。否則,使用其他命令將再次重置變量值。

  • 要暫停腳本的執行,它應該足以寫入輸入行,如read -p x < /dev/tty。這次是陰險的標準輸入沖洗,我們克服了從tty要求輸入。

  • 使用read -rread通常更安全。

    -r原始輸入 - 禁用反斜線的解釋逃脫並且行繼續在讀取數據

所以代碼變體應該是:

while read -r copy 
do 
    cp -v $copy | tee -a $LOGFILE 
    # echo $? ${PIPESTATUS[0]}    # NOT HERE else you loose it 
    if [[ ${PIPESTATUS[0]} -ne 0 ]]  # $? was referred to the last command. 
     then        # Use ${PIPESTATUS[0]} instead 
     echo "Error copying files. ${copy} Exiting ..." | tee -a $LOGFILE 
              # It will wait that you press return 
     read -p "Press CTRL-C to interrupt, RETURN to continue " x < /dev/tty 
     # exit 1       # It will not exit: (#) means comment. 
    fi 
done < copy_new_files.tmp 

注意:如chepner建議捕獲cp退出狀態的問題也可以通過將while循環的標準輸出管道化爲單個ca來解決11到tee,而不是cpecho單獨,這是更加優雅。當然在這種情況下,你會在輸出文件中寫出週期中打印的所有文本,而,甚至不需要「按CTRL-C中斷,返回繼續」我添加的行。

+1

不需要「aaaaa」。 'read'已經有一個默認的變量'$ REPLY',所以如果你不使用的變量可能也只是寫'read' –

+0

謝謝,這是正確的像太陽一樣照耀:-)。我的目的是保持該值跳過暫停或在下次發現錯誤時直接退出。還有另外幾件事要解決,我等着他發佈源文件的一些行。 – Hastur

+1

捕獲'cp'的退出狀態的問題也可以通過將'while'循環的標準輸出單獨調用到'tee'而不是'cp'和'echo'來修復。 – chepner