Que fait `. / path / command` faire? (Espace après point, chemin absolu)

7

De ce guide à l'achèvement de Bash, nous apprenons que pour que Bash effectue l'auto-complétion, il faut effectuer . /etc/etc/bash_completion.d/foobar( notez l'espace après. ) pour que l'achèvement de Bash fonctionne.

$ /etc/bash_completion.d/ssh
bash: /etc/bash_completion.d/ssh: Permission denied
$ . /etc/bash_completion.d/ssh
$ ls -l /etc/bash_completion.d | grep ssh
-rw-r--r-- 1 root root   297 Jan 28 18:04 ssh

Est-ce .un raccourci pour la sourcecommande? Sinon, qu'est-ce que c'est? Il est impossible de chercher sur Google, de man sourcene rien retourner apropos sourceet de info sourcedonner tellement d'informations non pertinentes que je ne peux pas dire si ce que je recherche est là. Comment pourrais-je même commencer à RTFM pour trouver moi-même la réponse à cette question?

dotancohen
la source
Lisez la bashpage de manuel car il s'agit d'une commande intégrée, recherchez l'explication de la source, il est difficile de la manquer.
Anthon
3
"Est-ce .un raccourci pour la commande source?" - c'est vraiment l'inverse: .c'est la commande, et sourcec'est l'alias de compatibilité (pour la compatibilité avec csh). Notez que cela sourcen'existe pas uniquement dans le shell bourne POSIX standard ..
Celada
Souvent quand c'est simple ça reste caché ... Ça peut être aussi simple que d'écrire " aide ": jetez un œil ci-dessous ;)
Hastur

Réponses:

14

Oui .est identique à la sourcefonction.

Comme toujours, la première référence est la man bashpage de manuel où vous pouvez confirmer votre supposition initiale en recherchant/ source

... fonction shell ou script exécuté avec .ou source ...

est la première référence, mais un peu plus loin, vous trouverez une section Commandes intégrées au shell

. filename [arguments]
source filename [arguments]
Lisez et exécutez les commandes à partir de filename dans l'environnement shell actuel et retournez l'état de sortie de la dernière commande exécutée à partir de filename. Si le nom de fichier ne contient pas de barre oblique, les noms de fichiers dans PATH sont utilisés pour rechercher le répertoire contenant le nom de fichier. Le fichier recherché dans PATH n'a pas besoin d'être exécutable. Lorsque bash n'est pas en mode posix, le répertoire courant est recherché si aucun fichier n'est trouvé dans PATH. Si l'option sourcepath de la commande intégrée shopt est désactivée, le CHEMIN n'est pas recherché. Si des arguments sont fournis, ils deviennent les paramètres de position lorsque le nom de fichier est exécuté. Sinon, les paramètres de position restent inchangés. Le statut de retour est le statut de la dernière commande quittée dans le script (0 si aucune commande n'est exécutée) et false si le nom de fichier n'est pas trouvé ou ne peut pas être lu.

Ce fait qu'il s'agit d'une fonction intégrée bash est la raison pour laquelle la source ne vient pas avec sa propre page de manuel, c'est pourquoi apropos a échoué.

HBruijn
la source
Merci, je n'aurais jamais pensé à jouer man bash, mais j'ajouterai cela à mes techniques "essayer avant de poster". Cette page a l'air de me prendre des mois pour la revoir et la comprendre complètement, je suis dans un bon moment!
dotancohen
Comme toujours, la première référence est man bash? Je suis sûr que si j'ai un problème avec la sshcommande, cela ne m'aidera pas beaucoup. C'est plus la référence de dernier recours.
Anthon
Si vous écrivez des scripts bash et étudiez l'auto-complétion, oui, ce le serait certainement. Mais c'est peut-être la voix de l'expérience.
HBruijn
La commande dot était dans le shell Bourne et est standardisée dans le shell POSIX. La commande source était l'analogue dans le shell C, et a été ajoutée à Bash (et n'est pas standardisée par POSIX).
Jonathan Leffler
pour les commandes bash que vous pouvez utiliser help, comme dans help sourceouhelp .
Carlos Campderrós
4

Vos réponses en bref:

  1. . absolute_path/mycommand source le fichier de script mycommandqui se trouve dans le répertoire absolute_path/. Pour d'autres références lire ici
  2. Oui . et sourcesont équivalents.
  3. Au besoin, demandez helpà bash shelllui - même. Vous aurez une réponse pour les commandes intégrées.

Quelques mots en plus
Souvent, le moyen le plus simple est aussi le plus insaisissable: nous ne pensions pas pouvoir demander helpau shell lui-même, lorsque les commandes sont définies en interne.
Avec type .et type sourcenous pouvons remarquer que ce sont des commandes intégrées .

Hastur@Cthulhu:~> type . source  
. is a shell builtin  
source is a shell builtin

Une fois que nous le savons, helpnous pouvons avoir rapidement des informations à leur sujet.
La commande helpsans paramètre de l'invite nous donne:

GNU bash, version 4.1.2 (1) ...
Ces commandes shell sont définies en interne .
Tapez helppour voir cette liste. Tapez help namepour en savoir plus sur le nom de la fonction .
Utilisez info bashpour en savoir plus sur le shell en général.
Utilisez man -k' orinfo 'pour en savoir plus sur les commandes ne figurant pas dans cette liste.

Pendant ce temps , avec help .ainsi que help sourcevous obtenez le même identique aide:

source: source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.

"L'évident est ce qui n'est jamais vu jusqu'à ce que quelqu'un l'exprime simplement." K.Gibran

Hastur
la source
1

Ce point "." signifie lire et exécuter des commandes à partir de l'argument nom de fichier dans le contexte shell actuel. C'est équivalent à source. Ce style est issu du shell Bourne, et veuillez vous référer à http://ss64.com/bash/source.html

user94000
la source