Bash 用于过程取代的pipefail

Bash 用于过程取代的pipefail,bash,Bash,我有一个使用errexit和pipefail的Bash脚本: set -e set -o pipefail diff $FILE <($COMMAND) set-e 设置-o管道故障 diff$FILE在这里使用临时文件有两个原因: 它使从$COMMAND捕获错误变得更容易 它允许diff(如有必要)重新读取部分文件 不要使用过程替换。使用var=$(COMMAND)然后使用diff“$FILE”@EtanReisner basherrexit(lol)是常见的,但我不确定问题是否出在

我有一个使用
errexit
pipefail
的Bash脚本:

set -e
set -o pipefail
diff $FILE <($COMMAND)
set-e
设置-o管道故障

diff$FILE在这里使用临时文件有两个原因:

  • 它使从
    $COMMAND
    捕获错误变得更容易
  • 它允许
    diff
    (如有必要)重新读取部分文件


  • 不要使用过程替换。使用
    var=$(COMMAND)
    然后使用
    diff“$FILE”@EtanReisner bash
    errexit
    (lol)是常见的,但我不确定问题是否出在
    errexit
    。在我看来,进程替换中类似于
    pipefail
    的程序似乎丢失了。问题是,您希望
    errexit
    捕获
    $COMMAND
    的失败并杀死您的脚本,但它没有这样做,因为这样做不可靠
    diff
    在空文件上运行很好,这对
    diff
    来说不是一个错误(我不认为您可以让它认为是这样,尽管您可以在需要时发布diff检查)。在这种情况下,shell没有退出状态
    $COMMAND
    。虽然如果它能得到它,理论上,可能会有一个
    procsubail
    或类似的东西,让你在
    diff
    完成后手动检查它的退出状态,是的。
    trap 'rm file2' EXIT
    if $COMMAND > file2; then
        diff "$FILE" file2
    else
        exit 1
    fi