POSIX 是否指定当嵌套点失败时是否继续脚本?

POSIX 是否指定当嵌套点失败时是否继续脚本?

例如,如果我有example.sh以下内容

. non-existing.sh
echo 'continues!'

然后,我在交互式会话中获取脚本. ./example.sh,如果我看到“继续!”在终端?这标准指定

如果没有找到可读文件,非交互式 shell 将中止;交互式 shell 应将诊断消息写入标准错误,但这种情况不应被视为语法错误。

我知道如果我. non-existing.sh会话应该继续,但我不确定它如何应用于嵌套源。在 Bash 中,它在打印错误消息后继续运行(即使使用set -o posix);在 Dash 中,它会中止当前脚本 ( example.sh)。我想知道这是否是 Bash 不符合 POSIX,或者是 POSIX 中未指定的(实现定义的行为)?

答案1

如果没有找到可读文件,非交互式 shell 将中止
……
否则,[如果是非交互式] 返回最后执行的命令的值 —https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#dot

第二行引用表明忽略早期命令的退出代码。但是我希望如果您将 shell 置于错误退出模式。那么这就是它应该做的。

答案2

POSIX 对嵌套源文件保持沉默,但我怀疑,如果提出解释请求,则现有文本dot将适用。

IEEE 标准 1003.1-2017:

姓名

    点 - 在当前环境中执行命令

概要

    . file

描述

    shell 应执行来自文件在目前的环境下。

    如果文件不包含 <slash>,shell 应使用指定的搜索路径小路找到包含的目录文件。然而,与普通命令搜索不同的是,通过实用程序不必是可执行的。如果没有找到可读文件,非交互式 shell 将中止;交互式 shell 应将诊断消息写入标准错误,但这种情况不应被视为语法错误。

至于dashbash,对任何一个 shell 都没有要求,除非它们声称完全符合 IEEE Std 1003.1-2017。

有趣的是,dash(1)Debian Stretch 上的当前联机帮助页 包含以下文本:

短跑是系统的标准命令解释器。当前版本短跑正在更改以符合 shell 的 POSIX 1003.2 和 1003.2a 规范。 ...只有 POSIX 指定的功能以及一些 Berkeley 扩展才被合并到此 shell 中。

所有这个联机帮助页都说的是.是:

. file

    shell 读取并执行指定文件中的命令。

如您所见,dash不声称符合 IEEE Std 1003.1-2017。尽管如此,我假设dash从标准的角度来看,这种行为可能是“错误的”,因为它中止了当前的脚本而不是继续。

相关内容