O que significa ponto de barra invertida como um comando?

17

Um software que eu instalei inseriu uma linha no meu perfil que dizia:

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

Eu sei que ponto .é sinônimo source, então eu suspeito que isso esteja apenas fornecendo o arquivo, mas eu nunca vi isso \.antes; faz algo mais?

Editar, em relação aos DVs: procurar por "barra invertida" leva a perguntas relacionadas ./ao chamar arquivos executáveis ​​e man sourceleva a uma página de manual em \.que não aparece. Não sei mais o que tentar, daí a pergunta.

Edição 2: veja perguntas relacionadas

Sheljohn
fonte

Respostas:

31

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 .(que sourceé sinônimo no bash).

Há um caso em que isso pode fazer diferença nesse contexto. Se um usuário definiu um alias chamado .anteriormente .profilee .profileestá sendo lido em um shell que expande aliases (o que o bash somente faz por padrão quando é chamado de maneira interativa), .ele acionaria o alias, mas \.ainda assim ativaria o builtin, porque o shell não tenta a expansão de alias em palavras que foram citadas de qualquer forma.

Eu suspeito que isso .foi alterado para \.porque um usuário reclamou depois de criar um alias para ..

Observe que \.chamaria uma função chamada .. Presumivelmente, os usuários que escrevem funções têm mais conhecimento do que os usuários que escrevem aliases e saberiam que redefinir um comando padrão .profileé uma má idéia se você incluir códigos de terceiros. Mas se você quiser ignorar os aliases e as funções, poderá escrever command .. O autor deste trecho também não fez isso porque se importava com conchas antigas que não tinham o commandinterior, ou mais provavelmente porque não o conheciam.

A propósito, definir qualquer apelido .profileé uma péssima idéia, porque .profileé um script de inicialização da sessão , não um script de inicialização do shell . Aliases para bash pertencem a .bashrc.

Gilles 'SO- parar de ser mau'
fonte
9

O \.é um "ponto literal", ou seja, apenas um ponto. Será tomado como o .comando padrão (semelhante a sourceem bash).

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

A <backslash>que não é citado preservará o valor literal do caractere a seguir , com exceção de a <newline>. Se a <newline>seguir <backslash>, o shell deve interpretar isso como continuação de linha. O <backslash>e <newline>deve ser removido antes de dividir a entrada em tokens . Como o escapado <newline>é removido inteiramente da entrada e não é substituído por nenhum espaço em branco, ele não pode servir como um separador de token.

O caractere de ponto pode ser alternativo:

$ alias .='echo hello'
$ .
hello

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

Depois que um token é delimitado, mas antes de aplicar as regras gramaticais na Shell Grammar, uma palavra resultante identificada como sendo a palavra de nome de comando de um comando simples deve ser examinada para determinar se é um nome alternativo válido e não citado .

Kusalananda
fonte
Eu estava procurando uma fonte oficial sobre como a barra invertida em uma palavra é interpretada como citando e como isso impede a expansão do alias. Obrigado pela referência!
Sheljohn 4/08/19
1
@Sheljohn Ver resposta atualizada.
Kusalananda