2017-08-01 120 views
3

返回後意外這是我的last question上堆棧溢出的後續問題。 我會削減腳本的基本部分,但如果s.o.認爲,知道腳本做什麼可能會有所幫助,您可以查看其他問題。bash腳本退出從功能

#!/usr/bin/env bash 
set -eu -o pipefail 

declare -a framelist 


#Print all results 

function output_values() { 
    echo "Results!"; 
} 

#parsing information from stdin 

function parser() { 

    while read tc; 
    do 

     if [ -z "$tc" ]; then 
     continue 
     fi 

     #Evaluation and saving result to array 

     echo $result_value; 

     framelist+=($result_value); 

     if ((<<some abort condition>>)); then 
     exec 0>&- 
     echo "Last result: $result_value"; 
     return 0 
     fi 

    done 
} 

some_command_writing_to_stdout | parser $2; 
output_values; 

腳本執行命令和管道輸出到我的本地函數,最後在該行echo "Last result: $result_value";,因爲它是打算做返回的結果。在此之後,它將終止提供在該功能中解析的數據的命令 - 這也適用。

當達到return 0時,我想應該執行腳本的下一行(在命令的右下方)output_values;,但它不是。

即使我稱之爲output_values功能直接回聲線前,打印的結果解析器功能,它不被執行。

它會變得更加怪異,因爲我可以註釋掉exec 0>&-和所有行爲一樣。即使應該由該行終止的命令也會在解析器函數退出時立即終止。

我有什麼改變能夠與我的解析器函數的結果上下工夫,它返回後?這不能是有意的行爲。

問候

曼努埃爾

+0

後的樣本代碼很簡單,工作併產生準確的故障 – Anubis

+0

你嘗試'設置-x'? –

+0

'set -x'只顯示'return 0'後面的退出,之後沒有執行任何操作。 –

回答

4

讓我們來看看man bash,節上pipefail

pipefail

如果設置,管道的返回值是最後一個(最右邊)命令的值用no來退出非零狀態,如果管道中的所有命令都成功退出,則爲零。該選項默認是禁用的。

set -e相結合,只要一個命令(管道)非零狀態退出將退出,唯一合乎邏輯的結論是: some_command_writing_to_stdout必須以非零退出狀態被排出(因爲顯然,parser0存在)。

這可以解釋爲什麼在管道(parser)下一個命令得到執行,爲什麼後,你的腳本完成。

很容易驗證這一點。只需更換與倒數第二個聲明:

(some_command_writing_to_stdout || true) | parser $2 
+0

你是絕對正確的。我註釋掉pipefail選項,它工作。不過,我希望能得到有關退出代碼的信息!= 0是使用'set -x'時立即退出腳本的原因。 –

+0

你沒有得到'some_command_writing_to_stdout'的退出代碼嗎? – randomir

+0

腳本輸出它從解析管道標準輸出數據和「最後結果」行中獲得的值。使用'set -x'不能提供比正在執行的最後一行更多的信息是'return 0'。 –