1. 程式人生 > >解釋bash指令碼中set -e與set -o pipefail的作用

解釋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 -eset -o pipefail作用

man set中的解釋:       set [--abefhkmnptuvxBCEHPT] [-o option] [arg ...]       set [+abefhkmnptuvxBCEHPT] [+o option] [arg ...]... ...        

linuxset命令: "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類的getset

更改 並不是 使用 var get方法 可變 pri ava value 在scala類中get和set使用有以下幾種: 1. var foo: Scala自動合成一個getter和一個setter 2. val foo: Scala自動合成一個getter scal

JavaScript的MapSet鍵值物件的用法

JavaScript的預設物件表示方式{}可以視為其他語言中的Map或Dictionary的資料結構,即一組鍵值對。 但是JavaScript的物件有個小問題,就是鍵必須是字串。但實際上Number或者其他資料型別作為鍵也是非常合理的。 為了解決這個問題,最新的ES6規範

理解Object.defineProperty函數的getset

默認 des 出現 cti ron function 臨時變量 str 接收 defineProperty是什麽: 該函數可以直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。通俗理解就是: 給對象添加一個新的屬性,或者針對對象裏的某些屬性,可以

javaMap,ListSet的區別

Map 是一種把鍵物件和值物件對映的集合,它的每一個元素都包含一對鍵物件和值物件。 Map沒有繼承於Collection介面 從Map集合中檢索元素時,只要給出鍵物件,就會返回對應的值物件。  Map 的常用方法:  1 新增,刪除操作:  [html] view plain copy  

python的dictset以及可變物件

1.dict與c++中的map操作基本是一樣的(目前看來),主要是鍵值的對映關係操作操作方法如下:dict_test = {'a': 1, 'b': 2, 'c': 3} print(dict_test['a']) #output 1 print('z' in d

網路請求的cookieset-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 updatesudo upgrade的作用及區別

最新版 卸載 新的 新版本 下載 就會 pda 列表 ubunt sudo apt-get update 這個命令,會訪問源列表裏的每個網址,並讀取軟件列表,然後保存在本地電腦。我們在新立得軟件包管理器裏看到的軟件列表,都是通過update命令更新的。 update後,

python區域性變數全域性變數的作用

區域性變數:在某個函式內部定義,作用在函式內部。生命週期:從變數被建立開始到函式結束死亡。 全域性變數:定義在.py模組內部,作用在整個.py模組。生命週期:從變數被創造開始到.py模組結束死亡。 下面用案例具體來說明它的作用域: (1): def Demo1(

springdepends-onlook-up的作用

depends-on的作用depends-on的作用一般是一個bean依賴於另外一個bean,被依賴的bean一般用於一些初始化和收尾的工作  如在這個例子中,DependentBean依賴於ResourceBean,  ResourceBean主要用於指定檔案路徑、開啟檔案