我在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
脚本在这两种情况下都能正常运行。
但我不明白为什么我需要那条假线。我相信解决办法一定很简单。
1条答案
按热度按时间piok6c0g1#
当DEBUG为N时,主脚本将退出,没有任何错误消息。
你有原始剧本里的set -e吗?
@Barmar是的... - 大师
脚本退出状态是执行的最后一个命令的退出状态。
当
[ "$DEBUG" = "Y" ]
为false时,它以非零退出状态退出。因此命令列表
[ "$DEBUG" = "Y" ] && echo && echo "Finished.." && echo
以非零退出状态退出。因此您的子脚本以非零退出状态退出。
因为您的“主脚本”有
set -e
,它检测到一个命令以非零退出状态退出并终止。使用
trap ... ERR
使set -e
可见。如果您指的是if
,请不要使用&&
。首选:当表达式具有非零退出状态时,
if
的退出状态为零。但是请注意,当表达式为true时,if
的退出状态是最后一个执行的命令的退出状态-在本例中,它将是第三个echo
,我们期望它以零退出。