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

Fra*_* Yu 5 posix

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

. non-existing.sh
echo 'continues!'
Run Code Online (Sandbox Code Playgroud)

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

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

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

fpm*_*phy 0

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

\n

来自IEEE 标准 1003.1-2017

\n
\n

姓名

    \n

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

\n

概要

    \n

    . file

\n

描述

    \n

    shell 应在当前环境中执行文件中的命令。

    \n

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

\n

\n

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

\n

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

\n
\n

dash是系统的标准命令解释器。\xc2\xa0\ndash 的当前版本正在更改\n以\n为\xc2\xa0 符合 shell 的 POSIX 1003.2 和 1003.2a 规范。\xc2\xa0 \ n...\xe2\x80\x82仅由 POSIX 指定的功能以及一些 Berkeley 扩展\n 被合并到此 shell 中。

\n
\n

这个联机帮助页所说的全部内容.是:

\n
\n

. file

    \n

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

\n

\n

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

\n