2013-04-04 38 views
0

我試圖在Linux上的shell腳本中捕獲失敗命令的錯誤代碼。在這種情況下我ffprobe命令:在一行上檢查與多個命令的shell腳本錯誤

#!/bin/sh 
    videoduration=$(ffprobe -loglevel error -show_format myfile.avi | grep duration | cut -d= -f2) 
    if [ $? -ne 0 ]; then 
     echo "ERROR" 
     exit 1 
    fi 
echo $videoduration 

如果我更改命令給一個假的文件名:

#!/bin/sh 
    videoduration=$(ffprobe -loglevel error -show_format myfile.av | grep duration | cut -d= -f2) 
    if [ $? -ne 0 ]; then 
     echo "ERROR" 
     exit 1 
    fi 
echo $videoduration 

錯誤代碼是沒用的,因爲這裏的技術狀態代碼仍爲0碼將仍然有一個成功grepcut。如何將此命令保存在單個變量中,但如果ffprobe命令失敗,則會退出並顯示錯誤消息?

編輯:我更喜歡非殼特定的答案,如果有的話。另外,建議重複涵蓋了類似的情況,但這裏的唯一潛在的選擇是創建一個臨時文件,像這樣:

f=`mktemp` 
(ffprobe ...; echo $?>$f) | ... 
e=`cat $f` #error in variable e 
rm $f 

看起來像一個黑客創建一個臨時文件?如果這是唯一的選擇,我將如何將它存儲在一個變量?

+0

我不這麼認爲。我更喜歡非特定於shell的答案。我會相應地編輯。 – Tom 2013-04-04 03:40:50

回答

0

問題是,即使ffprobe命令失敗,cut也不會,並返回零退出碼。管道的退出狀態是最後一個命令的退出狀態,除非您的shell有辦法更改此行爲以使第一個命令的退出狀態返回失敗。您可以在bash/kshset -o pipefail做到這一點:

$ false | cut -d= -f2; echo $? 
0 
$ set -o pipefail 
$ false | cut -d= -f2; echo $? 
1 
相關問題