2011-10-23 87 views
45

在Perl中的等效,您可以用die "some msg"一個錯誤味精退出。在bash中是否有等效的單個命令?現在,我實現這一目標使用命令:echo "some msg" && exit 1在bash,有沒有死「錯誤消息」

回答

2

是的,這幾乎是你怎麼做。

您可能會使用分號或換行符代替& &,因爲您要退出是否迴應成功(儘管我不確定是否會導致迴應失敗)。

編程的外殼意味着使用許多小的命令(一些內置的命令,一些微小的程序)做的一兩件事,並將它們與文件重定向,退出代碼邏輯和其他膠連接。

如果你已經習慣了這裏的一切正在使用的函數或方法進行語言這似乎不可思議,但你習慣了它。

+0

感謝,bonkydog。 – PJx

+0

現在我發現了另一個不愉快的效果。當echo命令執行時,解釋器不會等待它完成,但同時執行下面的代碼!這就是我所擁有的:'CMD1 || (echo'ERROR MSG'; exit 1); CMD2; CMD3'。現在,如果CMD1失敗,我期望回聲和退出發生,腳本將退出。但是現在,當CMD1失敗時,CMD2和CMD3實際上在回聲之前執行。這是根據錯誤日誌。奇怪與否? – PJx

+0

實際上,我認爲括號()可能是罪魁禍首。只要閱讀他們可能會在子shell中執行代碼的地方,這當然不會產生預期的效果。我只是將我的代碼更改爲if-fi塊,並且按預期工作。爲了我的好奇心,我可以將這些代碼合併成一個班輪嗎? – PJx

45

你可以滾你自己很輕鬆地:

die() { echo "$*" 1>&2 ; exit 1; } 
... 
die "Kaboom" 
+1

+1;但要注意的是,沒有參數的die會發出不需要的換行符。我喜歡'{test -n「$ @」&& echo「$ @」;出口1; }>&2' –

+4

@WilliamPursell:您可以使用'printf%s'$ {@ + $ @ $'\ n'}「' - 換句話說,如果它們存在,打印後跟一個換行符的參數。 – l0b0

+0

回想6年後的這個答案,我意識到''「$ *」'可能比'「$ @」'更有意義。在大多數情況下,這種行爲是相同的,但是對於'die -n Oops'不同,(不是你想這麼做)。 –

18

下面是我使用的是什麼。這是太小,放在一個庫,所以我必須鍵入它幾百次......

warn() { 
    echo "$0:" "[email protected]" >&2 
} 
die() { 
    rc=$1 
    shift 
    warn "[email protected]" 
    exit $rc 
} 

用法:die 127 "Syntax error"

0
# echo pass params and print them to a log file 
wlog(){ 
    # check terminal if exists echo 
    test -t 1 && echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" 
    # check LogFile and 
    test -z $LogFile || { 
     echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" >> $LogFile 
    } #eof test 
} 
# eof function wlog 


# exit with passed status and message 
Exit(){ 
    ExitStatus=0 
    case $1 in 
     [0-9]) ExitStatus="$1"; shift 1;; 
    esac 
    Msg="$*" 
    test "$ExitStatus" = "0" || Msg=" ERROR: $Msg : [email protected]" 
    wlog " $Msg" 
    exit $ExitStatus 
} 
#eof function Exit 
10

這是Perl的一個非常貼心的功能「死」(但與函數名):

function die 
{ 
    local message=$1 
    [ -z "$message" ] && message="Died" 
    echo "$message at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}." >&2 
    exit 1 
} 

如果內建函數失敗(與函數名死亡的慶典方式)

function die 
{ 
    local message=$1 
    [ -z "$message" ] && message="Died" 
    echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: ${FUNCNAME[1]}: $message." >&2 
    exit 1 
} 

所以,擊是保持所需的所有信息在若干環境變量:

  • LINENO - 當前執行的行數
  • FUNCNAME - 的函數調用棧,第一元件(索引0)是當前的函數,第二(索引1)是函數調用當前函數
  • BASH_LINENO - 呼叫行號,其中,相應FUNCNAME被稱爲
  • BASH_SOURCE的堆棧 - 源文件,其中corresponfing FUNCNAME存儲
  • 的陣列個
+4

你可以用'$ {1-Died}'完全避免局部變量 - 這樣,你甚至可以傳入一個空字符串,它將按照你所期望的那樣工作。 – tripleee

相關問題