例如,如果我有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
将适用。
姓名
点 - 在当前环境中执行命令
概要
. file
描述
shell 应执行来自文件在目前的环境下。
如果文件不包含 <slash>,shell 应使用指定的搜索路径小路找到包含的目录文件。然而,与普通命令搜索不同的是,通过点实用程序不必是可执行的。如果没有找到可读文件,非交互式 shell 将中止;交互式 shell 应将诊断消息写入标准错误,但这种情况不应被视为语法错误。
至于dash
或bash
,对任何一个 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
从标准的角度来看,这种行为可能是“错误的”,因为它中止了当前的脚本而不是继续。