Que signifie la barre oblique inversée en tant que commande?

17

Un logiciel que j'ai installé a inséré une ligne dans mon profil qui se lit comme suit:

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

Je sais que dot .est synonyme de source, donc je soupçonne que ce n'est que l'approvisionnement du fichier, mais je n'en ai jamais vu \.auparavant; fait-il autre chose?

Modifier, concernant les DV: la recherche de "point barre oblique inverse" conduit à des questions concernant l' ./appel de fichiers exécutables et man sourceconduit à une page de manuel où \.n'apparaît pas. Je ne sais pas quoi essayer d'autre, d'où la question.

Edit 2: voir les questions connexes

Sheljohn
la source

Réponses:

31

Une barre oblique inverse en dehors des guillemets signifie «interpréter le caractère suivant littéralement pendant l'analyse». Depuis .est un caractère ordinaire pour l'analyseur, \.est analysé de la même manière que ., et appelle le builtin .(dont sourceest un synonyme en bash).

Il y a un cas où cela pourrait faire une différence dans ce contexte. Si un utilisateur a défini un alias appelé .précédemment .profile, et .profileest lu dans un shell qui développe les alias (ce que bash ne fait par défaut que lorsqu'il est invoqué de manière interactive), alors .déclencherait l'alias, mais \.déclencherait toujours la fonction intégrée, car le shell n'essaye pas l'expansion d'alias sur les mots qui ont été cités de quelque façon que ce soit.

Je soupçonne que cela a .été changé en \.car un utilisateur s'est plaint après avoir créé un alias pour ..

Notez que \.cela invoquerait une fonction appelée .. Vraisemblablement, les utilisateurs qui écrivent des fonctions sont plus informés que les utilisateurs qui écrivent des alias et sauraient que la redéfinition d'une commande standard dans .profileest une mauvaise idée si vous allez inclure du code provenant de tiers. Mais si vous vouliez contourner les alias et les fonctions, vous pourriez écrire command .. L'auteur de cet extrait n'a pas fait cela soit parce qu'ils se souciaient de coquillages antiques qui n'avaient pas de fonction commandintégrée, ou plus probablement parce qu'ils n'en étaient pas conscients.

Soit dit en passant, définir un alias dans .profileest une mauvaise idée car il .profiles'agit d'un script d'initialisation de session , et non d'un script d'initialisation de shell . Les alias de bash appartiennent à .bashrc.

Gilles 'SO- arrête d'être méchant'
la source
9

Le \.est un "point littéral", c'est-à-dire juste un point. Elle sera considérée comme la .commande standard (similaire à sourcedans bash).

La norme POSIX a ceci à dire à ce sujet (je souligne)

A <backslash>qui n'est pas cité doit conserver la valeur littérale du caractère suivant , à l'exception de a <newline>. Si a <newline>suit le <backslash>, le shell doit interpréter cela comme une continuation de ligne. Le <backslash>et <newline>doit être supprimé avant de diviser l'entrée en jetons . Étant donné que l'échappement <newline>est entièrement supprimé de l'entrée et n'est remplacé par aucun espace blanc, il ne peut pas servir de séparateur de jeton.

Le caractère point peut être aliasé:

$ alias .='echo hello'
$ .
hello

ce qui signifie que \.cela éviterait d'utiliser la version aliasée de la .commande, car ,

Après qu'un jeton a été délimité, mais avant d'appliquer les règles grammaticales dans Shell Grammar, un mot résultant identifié comme étant le nom de commande mot d'une commande simple doit être examiné pour déterminer s'il s'agit d'un nom d'alias valide non cité .

Kusalananda
la source
Je cherchais une source officielle sur la façon dont la barre oblique inversée dans un mot est interprétée comme citant, et comment cela empêche l'expansion des alias. Merci pour la référence!
Sheljohn
1
@Sheljohn Voir la réponse mise à jour.
Kusalananda