反斜杠点是什么命令?


17

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

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

我知道dot .是的代名词source,所以我怀疑这只是在寻找文件,但是我从未见过\.。它还有其他作用吗?

编辑有关DV的内容:搜索“反斜杠点”会导致有关./调用可执行文件时的问题,并man source导致手册页\.不出现。我不知道还能尝试什么,因此是一个问题。

编辑2:查看相关问题

Answers:


31

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

在这种情况下,有一种情况可以有所作为。如果用户已经定义了一个叫做别名.较早.profile,并.profile在展开别名外壳正在被读取(其打坏只默认完成时,它的交互方式调用时),那么.将触发别名,但\.仍然会触发内置的,因为shell不会对以任何方式引用的单词尝试别名扩展。

我怀疑这.已更改为\.因为用户为别名后抱怨.

请注意,这\.将调用一个名为的函数.。据推测,编写函数的用户比编写别名的用户更为精通,并且.profile如果要包含来自第三方的代码,则会知道重新定义标准命令是一个坏主意。但是,如果您想绕过别名和函数,可以编写command .。此代码段的作者之所以没有这样做,是因为他们关心的是没有command内置功能的古董外壳,或者更可能是因为他们不了解它。

顺便说一句,在其中定义任何别名.profile不是一个好主意,因为.profile它是会话初始化脚本,而不是Shell初始化脚本。bash的别名属于.bashrc


9

\.是一种“文字点”,即只是一个点。它将作为标准.命令(类似于source中的bash)。

POSIX标准对此有话要说(我的重点是)

<backslash>不带引号的A 应该保留后面字符的文字值,但a除外<newline>。如果a <newline>跟随<backslash>,则外壳程序应将此解释为行继续。<backslash><newline>应拆分之前被删除的输入令牌。由于转义<newline>符已从输入中完全删除,并且没有被任何空格替换,因此它不能用作令牌分隔符。

点字符可以别名:

$ alias .='echo hello'
$ .
hello

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

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


我一直在寻找有关如何将单词中的反斜杠解释为引号以及如何防止别名扩展的官方资料。感谢您的参考!
Sheljohn

1
@Sheljohn请参阅更新的答案。
库萨兰达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.