¿Qué significa punto de barra diagonal inversa como un comando?

17

Un software que instalé insertó una línea en mi perfil que dice:

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

Sé que punto .es sinónimo de source, por lo que sospecho que esto solo es el origen del archivo, pero nunca lo he visto \.antes; ¿hace algo más?

Editar, con respecto a los DV: la búsqueda de "punto de barra diagonal inversa" lleva a preguntas sobre ./cuándo llamar a archivos ejecutables, y man sourcelleva a una página de manual donde \.no aparece. No sé qué más probar, de ahí la pregunta.

Edición 2: ver preguntas relacionadas

Sheljohn
fuente

Respuestas:

31

Una barra invertida fuera de las comillas significa "interpretar el siguiente carácter literalmente durante el análisis". Dado que .es un carácter ordinario para el analizador, \.se analiza de la misma manera .e invoca el incorporado .(del cual sourcees sinónimo en bash).

Hay un caso en el que podría hacer una diferencia en este contexto. Si un usuario ha definido un alias llamado .anteriormente .profiley .profilese está leyendo en un shell que expande los alias (que bash solo lo hace de manera predeterminada cuando se invoca de forma interactiva), entonces. activaría el alias, pero \.aún activaría el builtin, porque el shell no intenta la expansión de alias en palabras que fueron citadas de ninguna manera.

Sospecho que .se cambió a \.porque un usuario se quejó después de haber hecho un alias para. .

Tenga en cuenta que \.invocaría una función llamada .. Presumiblemente, los usuarios que escriben funciones tienen más conocimiento que los usuarios que escriben alias y sabrían que redefinir un comando estándar .profilees una mala idea si se va a incluir código de terceros. Pero si desea omitir ambos alias y funciones, puede escribir command .. El autor de este fragmento tampoco hizo esto porque se preocupaba por las conchas antiguas que no teníancommand incorporado, o más probablemente porque no lo sabían.

Por cierto, definir cualquier alias en .profilees una mala idea porque .profilees un script de inicialización de sesión , no un script de inicialización de shell . Los alias para bash pertenecen .bashrc.

Gilles 'SO- deja de ser malvado'
fuente
9

El \.es un "punto literal", es decir, solo un punto. Se tomará como el .comando estándar (similar a sourcein bash).

El estándar POSIX tiene esto que decir sobre esto (mi énfasis)

A <backslash>que no se cita deberá preservar el valor literal del siguiente carácter , con la excepción de a <newline>. Si a <newline>sigue a <backslash>, el shell interpretará esto como una continuación de línea. El <backslash>y <newline>se eliminará antes de dividir la entrada en tokens . Dado que el escape <newline>se elimina por completo de la entrada y no se reemplaza por ningún espacio en blanco, no puede servir como un separador de tokens.

El carácter de punto puede tener un alias:

$ alias .='echo hello'
$ .
hello

lo que significa que \.evitaría usar la versión con alias del .comando, porque ,

Después de que se haya delimitado un token, pero antes de aplicar las reglas gramaticales en Shell Grammar, se examinará una palabra resultante que se identifique como la palabra de nombre de comando de un comando simple para determinar si es un nombre de alias válido sin comillas .

Kusalananda
fuente
Estaba buscando una fuente oficial sobre cómo la barra invertida en una palabra se interpreta como una cita, y cómo esto evita la expansión de alias. Gracias por la referencia!
Sheljohn el
1
@Sheljohn Ver respuesta actualizada.
Kusalananda