当管道中发生错误时,如何使bash脚本最终失败

时间:2018-11-26 10:58:24

标签: bash pipe

现在我在脚本中使用它:

set -euxo pipefail

如果管道中有错误,这将使我的bash脚本立即失败。 当我离开此选项时,我的脚本将完全运行,并以0号出口结束(无错误)。

我想两者兼而有之。我想结束整个脚本,但有exit 1;最后,如果管道中有错误。

我的脚本如下:

#!/bin/bash
set -euxo pipefail
curl --fail --compressed -u "$CREDS" -X GET --header 'Accept: xxx' --header 'Accept-Language: de-DE' 'https://api/call1' | jq -S "." > "output1.json"
curl --fail --compressed -u "$CREDS" -X GET --header 'Accept: xxx' --header 'Accept-Language: de-DE' 'https://api/call2' | jq -S "." > "output2.json"
cat output1.json
cat output2.json

因此,如果call1失败,我不想退出脚本。如果call1失败,我想转到call2cat命令,然后用exit code 1退出脚本。

2 个答案:

答案 0 :(得分:2)

请勿使用set -e,因为这会使脚本在出现第一个错误时退出。只需在call1call2之后保存退出代码,并在cat命令之后以适当的退出代码退出即可:

#!/usr/bin/env bash -ux
set -uxo pipefail

curl --fail --compressed -u "$CREDS" -X GET --header 'Accept: xxx' --header 'Accept-Language: de-DE' 'https://api/call1' | jq -S "." > "output1.json"
ret1=$?
curl --fail --compressed -u "$CREDS" -X GET --header 'Accept: xxx' --header 'Accept-Language: de-DE' 'https://api/call2' | jq -S "." > "output2.json"
ret2=$?

cat output1.json
cat output2.json

exit $((ret1 | ret2))

答案 1 :(得分:0)

子壳。

set -euo pipefail
export SHELLOPTS

(
   set -euo pipefail
   curl --fail --compressed -u "$CREDS" -X GET --header 'Accept: xxx' --header 'Accept-Language: de-DE' 'https://api/call1' | jq -S "." > "output1.json"
) && res1=$? || res1=$?

(
   set -euo pipefail
   curl --fail --compressed -u "$CREDS" -X GET --header 'Accept: xxx' --header 'Accept-Language: de-DE' 'https://api/call2' | jq -S "." > "output2.json"
) && res2=$? || res2=$?

if (( res1 != 0 || res2 != 0 )); then
   echo "Och! Command 1 failed or command 2 failed, what is the meaning of life?"
   exit 1;
fi

Subshel​​l让您获取在其中执行的命令的返回值。