簡體   English   中英

從錯誤上自動退出bash shell腳本:set + e似乎沒有完成這項工作

[英]Automatic exit from bash shell script on error: set +e does not seem to do the job

雖然我知道20年來shell腳本並不關心錯誤,但我默默地對這種粗心大意感到好笑。 即使你明確要求他們不要吞下錯誤並遵循崩潰早期原則仍然不會發生。

參考自動退出bash shell腳本時出錯set +e似乎沒有完成這項工作,這里有一個簡短的例子:

#!/bin/bash -vx
set +e
apt-get install nonexisting1
apt-get install nonexisting2
set -e

輸出:

#!/bin/bash -vx
set +e
+ set +e
apt-get install nonexisting1
+ apt-get install nonexisting1
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package nonexisting1  <--- first error, now stop!
apt-get install nonexisting2           <--- why do we continue here?
+ apt-get install nonexisting2
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package nonexisting2
set -e
+ set -e

如何確保我的腳本執行所有命令而不會出現錯誤或立即停止? 我不喜歡寫|| exit 1 在幾乎每一行的末尾都|| exit 1

shell中的選項(反直覺地)使用減號打開並使用加號關閉。

即便如此, set -e選項僅在程序正確返回非零錯誤狀態時才有效。

雖然apt-get手冊說它應該這樣做,但其他帖子表明它經常沒有(參見apt-get update退出狀態 )。

運行后驗證apt命令的返回狀態(例如,使用echo $? )。 如果它返回非零,則set -e應該起作用。

我猜你只是用set + e代替set -e,反之亦然。 如果你只是這樣做

#!/bin/bash -vx
set -e
apt-get install nonexisting1
apt-get install nonexisting2
set +e

它應該在第一行之后停止。

為什么要先設置“+ e”腳本?
這是我的例子:

#!/bin/bash  -xv

set -e 

dskakj

echo "Hello dear" 
apt-get install bash

輸出:

#!/bin/bash  -xv

set -e 
+ set -e

dskakj
+ dskakj
./a.sh: line 5: dskakj: command not found

注意:不需要設置腳本的“+ e”結尾。

對於像你這樣的四行腳本, set -e確實合理,假設apt-get確實以非零退出代碼退出錯誤。

但是,關於SO上set -e大量討論表明它不是一種可靠的錯誤處理技術。 Bash文檔證實了這一點。

我們別無選擇,只能查看狀態變量$? 如果我們希望我們的腳本可靠,那么在每個命令之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM