[英]Can the exit code of a subshell be captured when declaring a variable with process substitution?
[英]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_CODE
為1
並運行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.