现在我在脚本中使用它:
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
失败,我想转到call2
和cat
命令,然后用exit code 1
退出脚本。
答案 0 :(得分:2)
请勿使用set -e
,因为这会使脚本在出现第一个错误时退出。只需在call1
和call2
之后保存退出代码,并在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
Subshell让您获取在其中执行的命令的返回值。