shell 子脚本导致主脚本退出?

ahy6op9u  于 2023-05-07  发布在  Shell
关注(0)|答案(1)|浏览(256)

我在bash中看到了非常奇怪的行为,我试图理解发生了什么。
我有一个主要的脚本:

#!/usr/bin/env bash
set -eu

DEBUG="N"

source child.sh

echo "Returned"

一个子脚本:

#!/usr/bin/env bash
set -eu

[ "$DEBUG" = "Y" ] && echo && echo "Finished.." && echo

当DEBUG为Y时,主脚本继续正常运行。但是当DEBUG为N时,主脚本会退出,没有任何错误消息,并且永远不会到达“Returned”行。
当我在末尾添加一个额外的虚拟行时,它变成:

#!/usr/bin/env bash
set -eu

[ "$DEBUG" = "Y" ] && echo && echo "Finished.." && echo
echo "" > /dev/null

脚本在这两种情况下都能正常运行。
但我不明白为什么我需要那条假线。我相信解决办法一定很简单。

piok6c0g

piok6c0g1#

当DEBUG为N时,主脚本将退出,没有任何错误消息。
你有原始剧本里的set -e吗?
@Barmar是的... - 大师
脚本退出状态是执行的最后一个命令的退出状态。
[ "$DEBUG" = "Y" ]为false时,它以非零退出状态退出。
因此命令列表[ "$DEBUG" = "Y" ] && echo && echo "Finished.." && echo以非零退出状态退出。
因此您的子脚本以非零退出状态退出。
因为您的“主脚本”有set -e,它检测到一个命令以非零退出状态退出并终止。
使用trap ... ERR使set -e可见。如果您指的是if,请不要使用&&。首选:

if [[ "$DEBUG" = "Y" ]]; then
   echo
   echo "Finished.."
   echo
fi

当表达式具有非零退出状态时,if的退出状态为零。但是请注意,当表达式为true时,if的退出状态是最后一个执行的命令的退出状态-在本例中,它将是第三个echo,我们期望它以零退出。

相关问题