我安装的软件在我的个人资料中插入了一行内容:
[ -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
这\.
是一个“字面点”,即只是一个点。它将被视为标准.
命令(类似于source
in bash
)。
POSIX 标准有这样的说法关于这个(我的重点)
<backslash>
未加引号的A应保留后续字符的字面值,除了 a<newline>
。如果 a<newline>
跟在 后面<backslash>
,shell 会将其解释为行继续。在将输入拆分为标记之前应<backslash>
删除and<newline>
。由于转义符<newline>
被完全从输入中删除并且不被任何空格替换,因此它不能用作标记分隔符。
点字符能别名:
$ alias .='echo hello'
$ .
hello
这意味着\.
将避免使用该命令的别名版本.
,因为,
在标记被定界之后,但在应用 Shell Grammar 中的语法规则之前,应检查被识别为简单命令的命令名称单词的结果单词,以确定是否是未引用的,有效的别名。