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 basherrexit
(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