Quelle est la différence entre: “. “ou” source “,” bash ou $ SHELL “et” ./ “ou” “?

Je connais cette source et . faire la même chose, et je serais surpris d’apprendre si les autres paires de commandes du titre n’ont pas la même chose (parce que j’utilise bash comme shell, $SHELL [script] et bash [script] sont équivalent, non ??).

Alors, quelle est la différence entre les trois méthodes d’exécution du script? Je demande parce que je viens d’apprendre que la recherche d’un script n’est pas la même chose que son exécution. D’une manière que je n’ai pas trouvée évidente en exécutant mes “expériences” et en lisant les pages de manuel.

Quelles sont les autres différences subtiles que je ne pourrais pas trouver en appelant aveuglément ces fonctions sur des scripts incroyablement simples que j’ai écrits? Après avoir lu la réponse ci-dessus, je peux fortement deviner que la réponse à ma question sera une explication assez simple, mais que je ne découvrirais presque jamais entièrement.

Voici l’expérience que j’ai faite:

 $. myScript.sh "This is the output to my script. I'd like to think it's original." $source myScript.sh "This is the output to my script. I'd like to think it's original." $bash myScript.sh "This is the output to my script. I'd like to think it's original." $$SHELL myScript.sh "This is the output to my script. I'd like to think it's original." $./myScript.sh "This is the output to my script. I'd like to think it's original." $myScript.sh "This is the output to my script. I'd like to think it's original." 

. script . script et source script exécutent le contenu du script dans l’environnement actuel , c’est-à-dire sans créer de sous-shell. En revanche, cela permet au script d’affecter l’environnement actuel, par exemple en modifiant les variables d’environnement ou en modifiant le répertoire de travail en cours. En revanche, cela permet au script d’affecter l’environnement actuel, ce qui constitue un danger potentiel pour la sécurité.

bash script transmet le script à l’interpréteur bash à exécuter. Tout ce que shebang est donné par le script lui-même est ignoré. (“Shebang” faisant référence à la première ligne de script , qui pourrait par exemple lire #!/bin/bash , ou #!/usr/bin/perl , ou #!/usr/bin/awk , pour spécifier l’interpréteur à utiliser .)

$SHELL script transmet le script à tout ce que votre interpréteur de shell actuel doit exécuter. Cela peut ou non être bash . (La variable d’environnement SHELL contient le nom de votre interpréteur de shell actuel. $SHELL , s’il exécute bash, est évalué dans /bin/bash , avec l’effet détaillé dans le paragraphe précédent.)

./script exécute le contenu d’un script fichier dans le répertoire de travail en cours . Si ce fichier n’existe pas, une erreur est générée. Le contenu de $PATH n’a aucun effet sur ce qui se passe.

script recherche un script fichier dans les répertoires répertoriés dans $PATH , qui peut ou non inclure le répertoire de travail en cours. Le premier script trouvé dans cette liste de répertoires est exécuté, ce qui peut ou non être celui de votre répertoire de travail actuel.