Peut-on utiliser "." exécuter des fichiers au lieu de la source - dans .bashrc dans Ubuntu et OS X?

11

OK, sourceexécute donc le script dans le shell actuel et .séparément, comme détaillé dans l' exécution du script avec "." Et avec "source" par exemple, mais, spécifiquement, dans mon .bashrcfichier, j'ai:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

Puis-je le remplacer par:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

Est-ce que cela fonctionnera sous OS X - est-ce le problème "POSIX"?

Je l'ai essayé et ce qui précède semble toujours fonctionner sur Ubuntu (donc ils fonctionnent réellement avec les deux sourceet ., c'est-à-dire, ils me donnent la fonctionnalité souhaitée dans le shell). Dois-je choisir l'un plutôt que l'autre, ou manque-t-il quelque chose?

FWIW, sur OS X, je me procède à .bashrcpartir de mon .bash_profile.

Michael Durrant
la source
1
S'il s'agit de coquilles basées sur "sh", j'utiliserais "." pour une compatibilité globale et si vous utilisez des shells basés sur «csh», j'utiliserais la source.
mdpc
2
Où dans la publication liée voyez-vous que " sourceexécute le script dans le shell actuel et .séparément"? Ils l'ont tous deux exécuté dans le shell actuel; sinon ça ne servirait à rien
Michael Mrozek

Réponses:

11

Voici la définition de POSIX de .dot:

Le shell doit exécuter des commandes à partir du fichier dans l'environnement actuel.

Si le fichier ne contient pas de /<slash>, le shell doit utiliser le chemin de recherche spécifié par $PATHpour trouver le répertoire contenant le fichier. Contrairement à la recherche de commandes normale, cependant, le fichier recherché par l' .dot utilitaire n'a pas besoin d' être exécutable. Si aucun fichier lisible n'est trouvé, un shell non interactif doit abandonner; un shell interactif doit écrire un message de diagnostic sur l'erreur standard, mais cette condition ne doit pas être considérée comme une erreur de syntaxe.

Compte tenu de ce qui précède, vous pourriez aussi bien remplacer votre tout [ -f ./file ] && source ./fileà . ./filefait. Si le fichier n'est pas là, le pire qui se produira, c'est que vous recevrez une notification lors de la connexion - ce qui est probablement une information que vous voudriez avoir, je pense.

Bien sûr, si vous préférez garder le test, vous pouvez le faire:

test -f ./file && . $_
mikeserv
la source
2
Oh, les gens savent $_, j'aime ça. :)
Andreas Wiese
@AndreasWiese - tout le monde devrait - c'est l'un des 7 paramètres spéciaux définis par POSIX.
mikeserv
+1 J'ai fini par utiliser l' test -f /.file && . $_approche illustrée ici
Michael Durrant
6
@mikeserv Non, $_n'est pas standardisé par POSIX. Les 8 paramètres spéciaux sont $@, $*, $#, $$, $!, $?, $-et $0. $_est explicitement omis . Votre commentaire incorrect a déclenché une question .
Gilles 'SO- arrête d'être méchant'
19

Dans bash, .et sourcesont des synonymes. En regardant bashle code source, le fichier builtin/source.def, vous pouvez voir .et sourceutiliser la même fonction interne source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC 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.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

Mais sourcen'est pas compatible POSIX, donc si votre script est appelé avec POSIX /bin/sh, vous devez utiliser à la .place de source. Puisque POSIX ne restreint pas le shell, tout votre script ci-dessus fonctionnera.

Personnellement, j'utilise toujours .au lieu de source. (Un grand nombre de scripts que j'ai écrits fonctionnent sous cron).

cuonglm
la source
Toutes choses étant égales par ailleurs, utilisez "source" au lieu de "." pour une raison: essayez de rechercher / grep pour "." expressions dans un grand script. C'est un cauchemar.
abonet
Bien que cette réponse explique pourquoi l'utilisation .est généralement "meilleure" que l'utilisation source, comme le dit @abonet, sourceest beaucoup plus facile à rechercher. Étant donné que les règles sont ponctuées dans de nombreuses langues, il est facile pour l'œil de les ignorer. C'est pourquoi je préfère utiliser source.
Joe