老胡的看法:
pipeline是我們使用Linux的日常操作,一般來說使用pipeline是為了簡化互動流程,目的在於得到最後的結果。缺點就是在設計pipeline語句的時候,只能看到最後的輸出值,不太方便除錯。老胡在這裡給出幾個辦法,可以輸出pipeline中每一個階段語句的返回值:
pipefail是ksh、zsh和bash中都使用的一個shell選項,它的作用是告訴shell輸出pipeline中未成功執行返回的其它狀態值。這大概是最簡單最方便的一個方式了。不過這個方法的缺點是隻能輸出pipeline中最後一段返回值不為0的值。
使用的方法是在shell中用set指令指定這個選項:
shell有一個內建變數,它是一個數組,用來存放pipeline中每一段的返回狀態,bash中的變數名字是大寫,zsh中是小寫的$pipestatus。如果我們想獲取pipeline中每一段的返回狀態,只需要按照訪問陣列的方式訪問$PIPESTATUS就可以了。如果想要得到所有段的返回值,陣列下標使用@:
在多段pipeline中,我們還可以利用列印語句和輸出重定向來實現每一段的pipeline返回值輸出。具體思路是:
開啟1個檔案描述符,並重定向到標準輸出;
設計pipeline,將需要的段中命令返回值輸出到新描述符;
其餘段的命令返回值均使用類似的方式輸出到新描述符;
將新描述符重定向到先前宣告的描述符;
比如:
總結一下,關於pipeline各段命令返回值的輸出,老胡大致上就這麼幾個思路了。另外還有比較妥協的辦法,那就是把各段先分拆開逐個除錯,不過這樣做明顯工作量太大了比較累。老胡建議用第二種方式是最舒服最安逸的,並且bash和zsh這兩種主流的shell都有支援。
老胡的看法:
pipeline是我們使用Linux的日常操作,一般來說使用pipeline是為了簡化互動流程,目的在於得到最後的結果。缺點就是在設計pipeline語句的時候,只能看到最後的輸出值,不太方便除錯。老胡在這裡給出幾個辦法,可以輸出pipeline中每一個階段語句的返回值:
一、使用shell選項pipefailpipefail是ksh、zsh和bash中都使用的一個shell選項,它的作用是告訴shell輸出pipeline中未成功執行返回的其它狀態值。這大概是最簡單最方便的一個方式了。不過這個方法的缺點是隻能輸出pipeline中最後一段返回值不為0的值。
使用的方法是在shell中用set指令指定這個選項:
set -o pipefail二、使用shell變數$PIPESTATUSshell有一個內建變數,它是一個數組,用來存放pipeline中每一段的返回狀態,bash中的變數名字是大寫,zsh中是小寫的$pipestatus。如果我們想獲取pipeline中每一段的返回狀態,只需要按照訪問陣列的方式訪問$PIPESTATUS就可以了。如果想要得到所有段的返回值,陣列下標使用@:
三、利用輸出重定向在多段pipeline中,我們還可以利用列印語句和輸出重定向來實現每一段的pipeline返回值輸出。具體思路是:
開啟1個檔案描述符,並重定向到標準輸出;
設計pipeline,將需要的段中命令返回值輸出到新描述符;
其餘段的命令返回值均使用類似的方式輸出到新描述符;
將新描述符重定向到先前宣告的描述符;
比如:
總結一下,關於pipeline各段命令返回值的輸出,老胡大致上就這麼幾個思路了。另外還有比較妥協的辦法,那就是把各段先分拆開逐個除錯,不過這樣做明顯工作量太大了比較累。老胡建議用第二種方式是最舒服最安逸的,並且bash和zsh這兩種主流的shell都有支援。