我安装的软件在个人资料中插入了以下内容:
[ -s "$SOME_FILE" ] && \. "$SOME_FILE"
我知道dot .是的代名词source,所以我怀疑这只是在寻找文件,但是我从未见过\.。它还有其他作用吗?
编辑有关DV的内容:搜索“反斜杠点”会导致有关./调用可执行文件时的问题,并man source导致手册页\.不出现。我不知道还能尝试什么,因此是一个问题。
编辑2:查看相关问题
我安装的软件在个人资料中插入了以下内容:
[ -s "$SOME_FILE" ] && \. "$SOME_FILE"
我知道dot .是的代名词source,所以我怀疑这只是在寻找文件,但是我从未见过\.。它还有其他作用吗?
编辑有关DV的内容:搜索“反斜杠点”会导致有关./调用可执行文件时的问题,并man source导致手册页\.不出现。我不知道还能尝试什么,因此是一个问题。
编辑2:查看相关问题
Answers:
引号外的反斜杠表示“在解析过程中按字面意义解释下一个字符”。由于.是解析器的普通字符,\.因此以与相同的方式进行解析.,并调用内置函数.(source在bash中是同义词)。
在这种情况下,有一种情况可以有所作为。如果用户已经定义了一个叫做别名.较早.profile,并.profile在展开别名外壳正在被读取(其打坏只默认完成时,它的交互方式调用时),那么.将触发别名,但\.仍然会触发内置的,因为shell不会对以任何方式引用的单词尝试别名扩展。
我怀疑这.已更改为\.因为用户为别名后抱怨.。
请注意,这\.将调用一个名为的函数.。据推测,编写函数的用户比编写别名的用户更为精通,并且.profile如果要包含来自第三方的代码,则会知道重新定义标准命令是一个坏主意。但是,如果您想绕过别名和函数,可以编写command .。此代码段的作者之所以没有这样做,是因为他们关心的是没有command内置功能的古董外壳,或者更可能是因为他们不了解它。
顺便说一句,在其中定义任何别名.profile不是一个好主意,因为.profile它是会话初始化脚本,而不是Shell初始化脚本。bash的别名属于.bashrc。
该\.是一种“文字点”,即只是一个点。它将作为标准.命令(类似于source中的bash)。
POSIX标准对此有话要说(我的重点是)
<backslash>不带引号的A 应该保留后面字符的文字值,但a除外<newline>。如果a<newline>跟随<backslash>,则外壳程序应将此解释为行继续。在<backslash>和<newline>应拆分之前被删除的输入令牌。由于转义<newline>符已从输入中完全删除,并且没有被任何空格替换,因此它不能用作令牌分隔符。
点字符可以别名:
$ alias .='echo hello'
$ .
hello
这意味着\.可以避免使用该.命令的别名版本,因为,
在定界标记后,但在Shell Grammar中应用语法规则之前,应检查标识为简单命令的命令名单词的结果单词,以确定其是否为未加引号的有效别名。