exécution du script avec «. "Et avec" source "

26
  1. Je me demandais si les deux façons suivantes d'exécuter un script bash sont équivalentes?

    . ./myScript.sh
    
    source myScript.sh
  2. Exécutent-ils tous les deux le contenu du script au lieu d'exécuter le script, c'est-à-dire qu'ils ne créent pas de sous-shell pour exécuter le script?
Tim
la source
1
Hé, c'est dans la page de manuel!
alex
@alex: montrez-moi s'il vous plaît? man ., man sourceou tout ce que je ne sais pas encore.
Tim
2
Voir type .ethelp .
rozcietrzewiacz
man $SHELL,/source
alex
4
. est plus portable selon les autres.
l0b0

Réponses:

21
  1. Ils sont équivalents en bash en ce qu'ils font exactement la même chose. D'un autre côté, il a source5 caractères de plus et n'est pas portable pour les shells POSIX uniquement ou Bourne alors que .(point) l'est, donc je ne me donne jamais la peine de l'utiliser source.

  2. C'est correct - le sourcing d'un fichier exécute les commandes dans le shell courant et cela affectera votre environnement shell actuel. Vous pouvez toujours passer des arguments au fichier source et bash recherchera $PATHle nom du fichier comme une commande normale s'il ne contient aucune barre oblique.


Pas lié à la question initiale de .vs source, mais dans votre exemple,

. ./myScript.sh 

n'est pas identique à

source myScript.sh

car tandis que .et sourcesont fonctionnellement identiques, myScript.shet ./myScript.shne sont pas les mêmes. Puisqu'il ./myScript.shcontient une barre oblique, il est interprété comme un chemin et le shell utilise simplement ./myScript.sh. Cependant, myScript.shn'a pas de barre oblique, le shell le $PATHrecherche d'abord. Il s'agit du comportement standard spécifié par POSIX pour .. La plupart des shells ont cette valeur par défaut bien qu'ils puissent ajouter des extensions (telles que la recherche dans le répertoire de travail actuel après la recherche de chemin) ou des options pour changer le comportement de ./ source.

jw013
la source
2
le comportement lorsque le chemin d'accès fourni du fichier ne contient pas /est dépendant du shell et pour bashet zshdépend si le mode POSIX est activé ou non. Notez également que dans de nombreuses implémentations de ksh, .se comporte différemment de source.
Stéphane Chazelas
@StephaneChazelas Oui, vous avez raison. J'ai ajouté une note pour préciser que la description ci-dessus est du standard POSIX.
jw013
8

Oui, ils sont équivalents. Il n'y a pas de différence fonctionnelle; .est juste un synonyme intégré pour source.

(Edit: Apparemment , cela est vrai que pour bashet zshquelques obus plus légers n'ont pas. source, Que .spécifié par POSIX donc ksh, dash, ash, etc. peuvent ne pas sourcevoir. La réponse de jw013 pour info.)

Caleb
la source
Merci! Mais les $ alias .sorties bash: alias: .: not found .
Tim
Autrement dit, ils sont tous les deux intégrés et l'alias est également intégré. Ceci est documenté , mais je suppose que «synonyme» est le bon terme dans ce cas, pas «alias».
Caleb