O que significa backslash dot como um comando?

14

Um software que instalei inseriu uma linha no meu perfil que diz:

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

Eu sei que o ponto . é sinônimo de source , então eu suspeito que isso seja apenas o arquivo, mas eu nunca vi \. antes; faz alguma outra coisa?

Editar, em relação a DVs: procurando por "barra invertida" leva a perguntas sobre ./ ao chamar arquivos executáveis, e man source leva a uma página man em que \. não aparece. Eu não sei mais o que tentar, daí a questão.

Editar 2: veja as perguntas relacionadas

por Sheljohn 04.08.2018 / 19:47

2 respostas

29

Uma barra invertida fora das aspas significa "interpretar o próximo caractere literalmente durante a análise". Como . é um caractere comum para o analisador, \. é analisado da mesma maneira que . e invoca o builtin . (do qual source é um sinônimo no bash).

Há um caso em que isso pode fazer diferença neste contexto. Se um usuário definiu um alias chamado . anterior em .profile e .profile está sendo lido em um shell que expande aliases (que o bash só faz por padrão quando é invocado interativamente), então . acionaria o alias, mas \. ainda acionaria o builtin, porque o shell não tenta expansão de alias em palavras que foram citadas de alguma forma.

Eu suspeito que . foi alterado para \. porque um usuário reclamou depois que eles criaram um alias para . .

Observe que \. invocaria uma função chamada . . Presumivelmente, os usuários que escrevem funções são mais bem informados do que os usuários que escrevem aliases e sabem que redefinir um comando padrão em .profile é uma má idéia se você incluir código de terceiros. Mas se você quisesse ignorar os aliases e as funções, poderia escrever command . . O autor deste trecho de código também não fez isso porque se importava com os shells antigos que não tinham o command incorporado ou, mais provavelmente, porque eles não sabiam disso.

A propósito, definir qualquer alias em .profile é uma má idéia porque .profile é um script de inicialização session , não um shell script de inicialização. Aliases para bash pertencem a .bashrc .

    
por 04.08.2018 / 20:04
9

O \. é um "ponto literal", ou seja, apenas um ponto. Ele será considerado como o comando padrão . (semelhante a source in bash ).

O padrão POSIX tem isso a dizer sobre isso (minha ênfase)

A <backslash> that is not quoted shall preserve the literal value of the following character, with the exception of a <newline>. If a <newline> follows the <backslash>, the shell shall interpret this as line continuation. The <backslash> and <newline> shall be removed before splitting the input into tokens. Since the escaped <newline> is removed entirely from the input and is not replaced by any white space, it cannot serve as a token separator.

O caractere de ponto pode ter um alias:

$ alias .='echo hello'
$ .
hello

, o que significa que \. evitaria usar a versão com alias do comando . , porque ,

After a token has been delimited, but before applying the grammatical rules in Shell Grammar, a resulting word that is identified to be the command name word of a simple command shall be examined to determine whether it is an unquoted, valid alias name.

    
por 04.08.2018 / 20:04

Tags