2017-01-11 87 views
2

我有一個需要組命令用我的shell腳本,大括號,這樣我可以指揮他們輸出到單獨的日誌文件是這樣的...如何從大括號內退出bash shell腳本?

>cat how-to-exit-script-from-within-curly-braces.sh 

{ 
    printf "%d\n" 1 
    printf "%d\n" 2 
} | tee a.log 
{ 
    printf "%d\n" 3 
    printf "%d\n" 4 
} | tee b.log 

    >./how-to-exit-script-from-within-curly-braces.sh 
1 
2 
3 
4 
    >cat a.log 
1 
2 
    >cat b.log 
3 
4 
    > 

雖然我已經添加了支撐,以方便記錄捲曲,我仍然希望腳本在退出命令在花括號內被調用時退出。

它當然不這樣做。它只是退出大括號,然後繼續上執行的,像這樣的腳本的其餘部分...

>cat how-to-exit-script-from-within-curly-braces.sh 

{ 
    printf "%d\n" 1 
    exit 
    printf "%d\n" 2 
} | tee a.log 
{ 
    printf "%d\n" 3 
    printf "%d\n" 4 
} | tee b.log 

    >./how-to-exit-script-from-within-curly-braces.sh 
1 
3 
4 
    >cat a.log 
1 
    >cat b.log 
3 
4 
    > 

使得退出代碼非零和添加「-e設置」的劇本似乎不工作...

>cat how-to-exit-script-from-within-curly-braces.sh 
set -e 

{ 
    printf "%d\n" 1 
    exit 1 
    printf "%d\n" 2 
} | tee a.log 
{ 
    printf "%d\n" 3 
    printf "%d\n" 4 
} | tee b.log 

    >./how-to-exit-script-from-within-curly-braces.sh 
1 
3 
4 
    >cat a.log 
1 
    >cat b.log 
3 
4 
    > 

有沒有辦法強制從大括號內退出腳本?

+1

除了笑臉以外,還有很好的Q(我感到脾氣暴躁; - >)但不確定S.O.現在正在將你的一些錯誤的shell語法轉換成笑臉。祝你們好運! – shellter

回答

5

沒有與exit和花括號沒有問題:

{ 
    exit 
} 
echo "This will never run." 

然而,與exit和管道出了問題,那就是你正在運行的產品分爲:

exit | exit 
echo "Still alive" 

在bash默認情況下,管道中的每個階段都運行在一個子shell中,並且exit只能退出該子shell。你的情況,你可以使用重定向和過程,而不是替代:

{ 
    printf "%d\n" 1 
    exit 1 
    printf "%d\n" 2 
} > >(tee a.log) 
echo "This will not run" 

注意,這是bash的特定代碼,並且不會在sh工作(例如使用#!/bin/shsh myscript時)。您必須改用bash

+0

工作得很漂亮。非常翔實。謝謝 –

+1

僅供參考......「set -o pipefail」似乎也適用。 「用於傳播錯誤,以便管道命令的返回值非零,如果其中一個命令以非零狀態退出」http://stackoverflow.com/a/19622300/2341218 –