解釋bash指令碼中set -e與set -o pipefail的作用
man set中的解釋:
set [--abefhkmnptuvxBCEHPT] [-o option] [arg ...]
set [+abefhkmnptuvxBCEHPT] [+o option] [arg ...]
... ...
-e Exit immediately if a pipeline (which may consist of a
single simple command), a subshell command enclosed in
parentheses, or one of the commands executed as part of
a command list enclosed by braces (see SHELL GRAMMAR
above) exits with a non-zero status. The shell does not
exit if the command that fails is part of the command
list immediately following a while or until keyword,
part of the test following the if or elif reserved
words, part of any command executed in a && or ││ list
except the command following the final && or ││, any
command in a pipeline but the last, or if the command’s
return value is being inverted with !. A trap on ERR,
if set, is executed before the shell exits. This option
applies to the shell environment and each subshell envi-
ronment separately (see COMMAND EXECUTION ENVIRONMENT
above), and may cause subshells to exit before executing
all the commands in the subshell.
... ...
-o option-name
The option-name can be one of the following:
... ...
pipefail
If set, the return value of a pipeline is the
value of the last (rightmost) command to exit
with a non-zero status, or zero if all commands
in the pipeline exit successfully. This option
is disabled by default.
.. ...
個人理解:
set -e表示一旦指令碼中有命令的返回值為非0,則指令碼立即退出,後續命令不再執行;
set -o pipefail表示在管道連線的命令序列中,只要有任何一個命令返回非0值,則整個管道返回非0值,即使最後一個命令返回0.
小實驗:
輸出結果:#!/bin/bash # testset.sh echo 'disable exit on non-zero return status and pipefail track' set +e set +o pipefail a=$[1/0]|b=2 echo 'return status = '$? echo 'disable exit on non-zero return status but enable pipefail track' set +e set -o pipefail a=$[1/0]|b=2 echo 'return status = '$? echo 'enable exit on non-zero return status and pipefail track' set -e set -o pipefail a=$[1/0]|b=2 echo 'return status = '$?
[[email protected] ~]# ./testset.sh
disable exit on non-zero return status and pipefail track
./testset.sh: line 6: 1/0: division by 0 (error token is "0")
return status = 0
disable exit on non-zero return status but enable pipefail track
./testset.sh: line 12: 1/0: division by 0 (error token is "0")
return status = 1
enable exit on non-zero return status and pipefail track
./testset.sh: line 18: 1/0: division by 0 (error token is "0")
[[email protected] ~]#
REF:
1. pipefail
http://petereisentraut.blogspot.com/2010/11/pipefail.html
2. linux中的set命令: "set -e" 與 "set -o pipefail"
http://blog.chinaunix.net/uid-15007890-id-3493077.html
相關推薦
解釋bash指令碼中set -e與set -o pipefail的作用
man set中的解釋: set [--abefhkmnptuvxBCEHPT] [-o option] [arg ...] set [+abefhkmnptuvxBCEHPT] [+o option] [arg ...]... ...
linux中的set命令: "set -e" 與 "set -o pipefail"
工作中經常在shell指令碼中看到set的這兩個用法,但就像生活中的很多事情,習慣導致忽視,直到出現問題才引起關注。1. set -eset命令的-e引數,linux自帶的說明如下:"Exit immediately if a simple command exits wi
Bash 指令碼中的 set -euxo pipefail
有些開發人員會用Bash來實現很複雜的功能,就像使用別的高階語言一樣。他可能覺得自己很牛逼但其他人早就想錘爆他了,Bash的可讀性和可維護性遠遠低於任何高階語言。更要命的是,Bash並沒有方便的除錯工具和防錯機制,出了問題你要排查半天。 在Ruby或者Python等高階語言裡,你很容易知道錯誤是哪行什麼型別
Scala類中的get與set
更改 並不是 使用 var get方法 可變 pri ava value 在scala類中get和set使用有以下幾種: 1. var foo: Scala自動合成一個getter和一個setter 2. val foo: Scala自動合成一個getter scal
JavaScript中的Map與Set鍵值物件的用法
JavaScript的預設物件表示方式{}可以視為其他語言中的Map或Dictionary的資料結構,即一組鍵值對。 但是JavaScript的物件有個小問題,就是鍵必須是字串。但實際上Number或者其他資料型別作為鍵也是非常合理的。 為了解決這個問題,最新的ES6規範
理解Object.defineProperty函數中的get與set
默認 des 出現 cti ron function 臨時變量 str 接收 defineProperty是什麽: 該函數可以直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。通俗理解就是: 給對象添加一個新的屬性,或者針對對象裏的某些屬性,可以
java中Map,List與Set的區別
Map 是一種把鍵物件和值物件對映的集合,它的每一個元素都包含一對鍵物件和值物件。 Map沒有繼承於Collection介面 從Map集合中檢索元素時,只要給出鍵物件,就會返回對應的值物件。 Map 的常用方法: 1 新增,刪除操作: [html] view plain copy
python中的dict與set以及可變物件
1.dict與c++中的map操作基本是一樣的(目前看來),主要是鍵值的對映關係操作操作方法如下:dict_test = {'a': 1, 'b': 2, 'c': 3} print(dict_test['a']) #output 1 print('z' in d
網路請求中的cookie與set-Cookie的互動模式和作用
首先我們需要思考,很多問題。 1.當很多人訪問統一個網伺服器,伺服器如何來區分不同的使用者呢? 答:sessionid,sessionid保證了瀏覽器和伺服器唯一性的通訊憑證號碼,session儲存在伺服器上, sessionid儲存在瀏覽器等客戶端,伺服器根據瀏覽器傳送來的sessionid作為一個唯一的
shell指令碼中的函式與子shell
shell指令碼中的函式與子shell 原文https://www.jianshu.com/p/7db79d7997b5 函式 函式的使用 bash中也有函式。一個函式就是一個子程式,是用於實現一串操作的程式碼塊。bash中的函式的形式如下: functi
linux指令碼中父shell與子shell 執行的幾種方式
本文主要介紹以下幾個命令的區別: shell subshell source $ (commond) `commond` Linux執行Scripts有兩種方式,主要區別在於是否建立subshell 1. source filename or . filename 不建立subshell,在當前shel
UNITY3D c#指令碼中處理類與結構體的區別
結構體的定義: 結構體也可以象類一樣可以單獨定義.class a{};struct a{}; 結構體也可以在名字前面加入控制訪問符.public struct student{};internal struct student{}; 如果結構體student沒有publice或者internal的宣告 類pr
bash指令碼中使用rm命令時的致命誤區
測試的shell為bash:如果在shell指令碼中如果使用了一個沒有宣告的變數,或者是一個聲明瞭但是沒有賦值的變數,那麼此時指令碼不會報錯,引用的這個變數也會預設為空,此時,如果指令碼中的rm命令的引數剛好使用了這個變數,那麼可能會造成不可估計的嚴重後果,以下為測試場景(注
set -e and set -o pipefail
set -e表示一旦指令碼中有命令的返回值為非0,則指令碼立即退出,後續命令不再執行; set -o pipefail表示在管道連線的命令序列中,只要有任何一個命令返回非0值,則整個管道返回非0值,即使最後一個命令返回0.
Linux shell指令碼中父子程序與變數的分析
轉載地址:https://site.douban.com/196781/widget/notes/12220452/note/261008964/ 【問題】一個 test.sh 裡面這麼寫 #! /bin/bash read test echo $test exit 0 儲
Linux shell script 的 關閉echo -e 在shell指令碼中輸出 “-e”
第一次寫 script指令碼 按照鳥哥的hello world 的程式寫了一下: #!/bin/bash # Program: # This program shows "hello World!" in your screen. #History: # 2015/07/1
Bash指令碼中進位制轉換
修改指令碼時,想直接用10進位制轉換為16進位制的方法,在網上搜了搜,結果是找到了,可惜所用系統中沒有對應的指令,還是用不成,最後就用了一個比較笨一點的方法。 既然有需要,就把搜到感覺有用的進位制轉換函式或指令都貼在這裡,便於以後應用。 shell可以在不呼叫第3方命
Ubuntu中 sudo update與sudo upgrade的作用及區別
最新版 卸載 新的 新版本 下載 就會 pda 列表 ubunt sudo apt-get update 這個命令,會訪問源列表裏的每個網址,並讀取軟件列表,然後保存在本地電腦。我們在新立得軟件包管理器裏看到的軟件列表,都是通過update命令更新的。 update後,
python中區域性變數與全域性變數的作用域
區域性變數:在某個函式內部定義,作用在函式內部。生命週期:從變數被建立開始到函式結束死亡。 全域性變數:定義在.py模組內部,作用在整個.py模組。生命週期:從變數被創造開始到.py模組結束死亡。 下面用案例具體來說明它的作用域: (1): def Demo1(
spring中depends-on與look-up的作用
depends-on的作用depends-on的作用一般是一個bean依賴於另外一個bean,被依賴的bean一般用於一些初始化和收尾的工作 如在這個例子中,DependentBean依賴於ResourceBean, ResourceBean主要用於指定檔案路徑、開啟檔案