代码之家  ›  专栏  ›  技术社区  ›  DenCowboy

如何在管道中发生错误时使bash脚本在最后失败

  •  1
  • DenCowboy  · 技术社区  · 6 年前

    现在我在脚本中使用这个:

    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 失败。如果 呼叫1 失败我想去 call2 以及 cat 在退出脚本之前的命令 exit code 1 .

    2 回复  |  直到 6 年前
        1
  •  2
  •   anubhava    6 年前

    不使用 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))
    
        2
  •  0
  •   KamilCuk    6 年前

    潜艇。

    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
    

    让我们获取在其中执行的命令的返回值。