簡體   English   中英

子shell中變量函數調用分配的錯誤退出代碼

[英]Wrong exit code for variable function call assignment in subshell

我有一個經常失敗的腳本。 傳遞正確的退出代碼至關重要。

此代碼按預期工作:

#!/usr/bin/env bash

function my_function {
    echo "Important output"
    exit 1
}

function cleanup {
  MY_EXIT_CODE=$?
  echo "MY_EXIT_CODE: ${MY_EXIT_CODE}"
}

trap cleanup EXIT

my_function

MY_EXIT_CODE1並運行echo $? 在腳本也給了我1之后(如預期的那樣)

但是,我需要將my_function的完整輸出同時發送到變量和控制台輸出。 為了做到這一點,正如這個答案中所建議的(這似乎是基於這個答案),我將我的代碼更改為

#!/usr/bin/env bash

function my_function {
    echo "Important output"
    exit 1
}

function cleanup {
  MY_EXIT_CODE=$?
  echo "MY_EXIT_CODE: ${MY_EXIT_CODE}"
}

trap cleanup EXIT

exec 5>&1
FF=$(my_function|tee /dev/fd/5)

現在退出代碼是錯誤的。 它是0而它應該是1 我知道這與子外殼處理有些相關,但我不知道如何解決它。

現在退出代碼是錯誤的。 是 0 而它應該是 1

不,你的假設是錯誤的。 假設tee成功,退出代碼應該是 0。來自posix shell 手冊

如果保留字! 不在管道之前,退出狀態應為管道中指定的最后一個命令的退出狀態。

管道中的“最后一個命令”是最右邊的命令。 因為在您的情況下tee以 0 退出,所以FF=$(.... | tee)的退出狀態為零。

如何解決。

這取決於您想要實現的行為。 通常,在 bash 中,您可以set -o pipefail以始終捕獲錯誤。

似乎簡單地說

set -o pipefail

在腳本文件的開頭就成功了。

是的,它是子殼和管道,試試這樣

FF=$(my_function|tee /dev/fd/5; exit $PIPESTATUS)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM