Source vs. pourquoi un comportement différent?

17

J'ai récemment appris que

. ./.a.aet ./.a.ac'est pareil.

Cependant, essayer source source .a.adonne une erreur. IMO, .étant l'alias de Bash, sourcene devrait pas se comporter différemment, alors qu'est-ce qui me manque?

Bonus, pourquoi est . .OK alors que source sourcenon?

LAFK dit réintégrer Monica
la source
8
Vous auriez pu choisir un nom plus clair pour votre exemple :). En tout cas, qu'est-ce qui vous a donné l'idée . scriptet ./scriptc'est la même chose? Ils ne le sont certainement pas . En outre, .n'est pas un alias pour source. C'est l'inverse. .est la norme et sourceest un alias de ..
terdon
2
Après avoir passé un peu de temps à regarder les scripts shell, vous vous habituez à la .commande, mais je veux dire, sourcec'est juste une meilleure commande, quand vous voyez source somefiledans un script, vous savez immédiatement ce que fait cette déclaration, mais . somefile non seulement ce n'est pas évident, vous pouvez facilement rater le . personnage
the_velour_fog
Bonus, pourquoi. . OK alors que la source n'est pas? - dans quelle mesure le message d'erreur bash: .: .: is a directorysur . .est ok besoins à expliquer.
contre-mode
@terdon - tout à fait raison. L'exemple original devait . ./.a.a .être honnête. : -DA quiz en quelque sorte, si vous voulez. :-) La question liée est géniale, merci beaucoup. Ce qui m'a donné cette idée: le fait que je l' avais vu aucune différence dans l' exécution de fichiers de cette façon et le fait que je lu quelque part .est un alias pour source. :-)
LAFK dit Réintégrer Monica

Réponses:

27

Vous ne pouvez pas simplement remplacer .par sourcepartout; si

. ./.a.a

fonctionne, vous pouvez remplacer le premier .(au moins dans Bash):

source ./.a.a

Le second .représente le répertoire courant, vous ne pouvez pas le remplacer par source(surtout pas ./avec sourcecomme vous l'avez fait).

source source

serait OK si vous aviez un fichier appelé sourcedans le répertoire courant, contenant quelque chose de significatif pour votre shell actuel. Je ne vois pas comment ça . .irait ...

De plus, . ./.a.aet ./.a.ane sont pas les mêmes, le second formulaire s'exécute .a.adans un shell séparé. Voir Quelle est la différence entre le sourcing ('.' Ou 'source') et l'exécution d'un fichier dans bash? pour plus de détails.

Stephen Kitt
la source
9

sourceest un mot clé shell qui est censé être utilisé comme ceci: sourcefilefilecontient des commandes shell valides. Ces commandes shell seront exécutées dans le shell actuel comme si elles étaient tapées à partir de la ligne de commande. Maintenant, .filefait exactement la même chose.

Au-delà de cela .seul signifie "le répertoire de travail actuel" comme dans ./xyz(" xyzdans ce répertoire") ou a/b/./c/./d(qui est identique à a/b/c/d).

Au-delà, .dans un nom de fichier n'a de sens que par convention comme dans .foobarlequel indique un fichier "caché" (pas vraiment ...) ou comme dans foobar.pdf, qui indique un format de fichier par le suffixe (ici .pdf).

Ces différentes significations ne peuvent pas être échangées.

contre-mode
la source
8
.n'est en aucun cas dépassé. Contrairement à sourcela manière portable, définie par POSIX , de rechercher un fichier. L' sourcealias est spécifique au shell et peut être absent (par exemple dans dash) ou se comporter différemment de la norme ..
terdon
Merci @terdon, Wiki dit que la source sous forme de point (.) N'est pas acceptable dans le shell C, où la commande est apparue pour la première fois.
Noam Manos
1
@NoamManos peut-être, mais le C-shell n'est pas POSIX, donc il peut (et fait) se comporter très différemment.
terdon