在Perl中的等效,您可以用die "some msg"
一個錯誤味精退出。在bash中是否有等效的單個命令?現在,我實現這一目標使用命令:echo "some msg" && exit 1
在bash,有沒有死「錯誤消息」
回答
是的,這幾乎是你怎麼做。
您可能會使用分號或換行符代替& &,因爲您要退出是否迴應成功(儘管我不確定是否會導致迴應失敗)。
編程的外殼意味着使用許多小的命令(一些內置的命令,一些微小的程序)做的一兩件事,並將它們與文件重定向,退出代碼邏輯和其他膠連接。
如果你已經習慣了這裏的一切正在使用的函數或方法進行語言這似乎不可思議,但你習慣了它。
你可以滾你自己很輕鬆地:
die() { echo "$*" 1>&2 ; exit 1; }
...
die "Kaboom"
+1;但要注意的是,沒有參數的die會發出不需要的換行符。我喜歡'{test -n「$ @」&& echo「$ @」;出口1; }>&2' –
@WilliamPursell:您可以使用'printf%s'$ {@ + $ @ $'\ n'}「' - 換句話說,如果它們存在,打印後跟一個換行符的參數。 – l0b0
回想6年後的這個答案,我意識到''「$ *」'可能比'「$ @」'更有意義。在大多數情況下,這種行爲是相同的,但是對於'die -n Oops'不同,(不是你想這麼做)。 –
下面是我使用的是什麼。這是太小,放在一個庫,所以我必須鍵入它幾百次......
warn() {
echo "$0:" "[email protected]" >&2
}
die() {
rc=$1
shift
warn "[email protected]"
exit $rc
}
用法:die 127 "Syntax error"
# 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
這是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存儲 的陣列個
你可以用'$ {1-Died}'完全避免局部變量 - 這樣,你甚至可以傳入一個空字符串,它將按照你所期望的那樣工作。 – tripleee
- 1. Application.Exit沒有殺死消息泵?
- 2. php中沒有錯誤消息
- 3. 錯誤消息:NBSP「沒有定義(symfony1.4)
- 4. Next沒有對於錯誤消息
- 5. jQuery GET失敗,沒有錯誤消息
- 6. 沒有消息的JDBC域錯誤
- 7. Sikuli IDE終止,沒有錯誤消息
- 8. dyld`__abort_with_payload:由於沒有錯誤消息
- 9. 我殺死rvm現在我有一個bash消息
- 10. linux bash沒有顯示任務消息
- 11. Perl:如何在沒有錯誤信息的情況下「死亡」?
- 12. IWICImagingFactory :: CreateDecoderFromStream()失敗,錯誤消息消息是沒有幫助的
- 13. 沒有ociexecute的結果。沒有錯誤消息提示
- 14. 使用GCM,沒有錯誤,但沒有收到消息
- 15. 沒有sendgrid的電子郵件,也沒有錯誤消息
- 16. ASP.Net窗體HttpClient的PostAsync沒有反應,沒有錯誤消息
- 17. SSMS沒有迴應沒有任何錯誤消息
- 18. 有沒有辦法在Django 1.7中重寫MinLengthValidator錯誤消息?
- 19. 僅在bash中存儲錯誤消息
- 20. 錯誤消息說只有「錯誤」
- 21. 發生Page_Error事件時沒有錯誤消息的錯誤
- 22. in.nextLine()顯然禁用了out.printf()。錯誤沒有錯誤消息
- 23. 領域導致ANR錯誤,沒有錯誤消息。
- 24. MS Access 2013:保留錯誤(-7713):此錯誤沒有消息
- 25. PHP-MySQL沒有關於SQL錯誤的錯誤消息
- 26. 傳統的ASP錯誤,並沒有錯誤消息
- 27. 谷歌圖表錯誤沒有消息或錯誤編號
- 28. 錯誤消息:-bash:/etc/profile.d/rvm.sh:沒有這樣的文件或目錄
- 29. 在父子之間發送消息 - 爲什麼沒有死鎖?
- 30. libjpeg在沒有消息的情況下死亡
感謝,bonkydog。 – PJx
現在我發現了另一個不愉快的效果。當echo命令執行時,解釋器不會等待它完成,但同時執行下面的代碼!這就是我所擁有的:'CMD1 || (echo'ERROR MSG'; exit 1); CMD2; CMD3'。現在,如果CMD1失敗,我期望回聲和退出發生,腳本將退出。但是現在,當CMD1失敗時,CMD2和CMD3實際上在回聲之前執行。這是根據錯誤日誌。奇怪與否? – PJx
實際上,我認爲括號()可能是罪魁禍首。只要閱讀他們可能會在子shell中執行代碼的地方,這當然不會產生預期的效果。我只是將我的代碼更改爲if-fi塊,並且按預期工作。爲了我的好奇心,我可以將這些代碼合併成一個班輪嗎? – PJx