2016-02-26 51 views
2

有人可以解釋這種行爲嗎?我覺得很奇怪。雙管道設置-e功能

#!/bin/bash 

set -e 

_func() { 
    cat non-existant-file 
    return 0 
} 

_func || echo "Not seen since _func returned zero" 
_func 
echo "Not seen since _func returned non-zero" 

輸出(GNU的bash,版本42年3月4日(1)-release下(x86_64-PC-Linux的GNU)):

$ bash func.sh 
cat: non-existant-file: No such file or directory 
cat: non-existant-file: No such file or directory 
$ 

回答

4

如果你看一下聯機幫助頁bash的,它專門說起這:

特別The shell does not exit if the command that fails is part of [...] any command executed in a && or || list except the command following the final && or || [...]

這種行爲是完全一樣的記錄/預期。

你可以看到自己這一點如果您運行是這樣的:

#!/bin/bash 

set -ex 
# set -x will tell you exactly where the shell exits. 

_func() { 
    cat non-existant-file 
    return 0 
} 

#_func || echo "Not seen since _func returned zero" 
cat non-existant-file || _func 
_func 
echo "Not seen since _func returned non-zero" 

從手冊頁:

set -e  Exit immediately if a pipeline (which may consist of a 
        single simple command), a list, or a compound command 
        (see SHELL GRAMMAR above), exits with a non-zero sta‐ 
        tus. 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 
        !. If a compound command other than a subshell returns 
        a non-zero status because a command failed while -e was 
        being ignored, the shell does not exit. 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. 

這正是你這裏的情況。