反斜杠点作为命令意味着什么?

反斜杠点作为命令意味着什么?

我安装的软件在我的个人资料中插入了一行内容:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

我知道 dot.是 的同义词source,所以我怀疑这只是获取文件,但我\.以前从未见过;它还有其他作用吗?

编辑,关于 DV:搜索“反斜杠点”会导致有关./调用可执行文件时的问题,并man source导致\.未出现的联机帮助页。我不知道还能尝试什么,所以才有这个问题。

编辑2:查看相关问题

答案1

引号外的反斜杠表示“在解析过程中按字面解释下一个字符”。因为.是解析器的普通字符,\.以与 相同的方式进行解析.,并调用内置命令.(它source是 bash 中的同义词)。

在一种情况下,它可以在这种情况下产生影响。如果用户定义了.之前在 中调用的别名.profile,并且.profile正在扩展别名的 shell 中读取(bash 默认情况下仅在交互调用时执行此操作),则将.触发别名,但\.仍会触发内置命令,因为 shell不会尝试对以任何方式引用的单词进行别名扩展。

我怀疑它.被更改为是\.因为用户在为..

请注意,这\.将调用一个名为 的函数.。想必编写函数的用户比编写别名的用户知识更丰富,并且知道.profile如果要包含来自第三方的代码,重新定义标准命令是一个坏主意。但如果您想绕过别名和函数,您可以编写command ..此代码片段的作者没有这样做,要么是因为他们关心没有内置功能的古董外壳command,要么更可能是因为他们没有意识到这一点。

顺便说一下,定义任何别名 in.profile是一个坏主意,因为.profile会议初始化脚本,不是初始化脚本。 bash 的别名属于.bashrc.

答案2

\.是一个“字面点”,即只是一个点。它将被视为标准.命令(类似于sourcein bash)。

POSIX 标准有这样的说法关于这个(我的重点)

<backslash>未加引号的A应保留后续字符的字面值,除了 a <newline>。如果 a<newline>跟在 后面<backslash>,shell 会将其解释为行继续。在将输入拆分为标记之前应<backslash>删除and<newline>。由于转义符<newline>被完全从输入中删除并且不被任何空格替换,因此它不能用作标记分隔符。

点字符别名:

$ alias .='echo hello'
$ .
hello

这意味着\.将避免使用该命令的别名版本.因为,

在标记被定界之后,但在应用 Shell Grammar 中的语法规则之前,应检查被识别为简单命令的命令名称单词的结果单词,以确定是否是未引用的,有效的别名。

相关内容