Quelle est la différence entre l'exécution d'un script comme celui-ci:
./test.sh
et en exécutant un script comme celui-ci:
. test.sh
?
J'ai essayé un script simple de deux lignes pour voir si je pouvais trouver s'il y avait une différence:
#!/bin/bash
ls
Mais les deux . test.sh
et ont ./test.sh
retourné la même information.
test.sh
n'est pas la même chose que./test.sh
(le premier invoque unePATH
recherche), il en va de même. test.sh
et. ./test.sh
différent de la même manière (le premier invoque unePATH
recherche). De nombreux shells semblent inclure implicitement.
à la fin d'PATH
une.
recherche de chemin d'accès, mais ce comportement n'est pas standard. Ainsi, il est plus juste de comparertest.sh
vs. test.sh
et./test.sh
vs. ./test.sh
.Réponses:
./test.sh
fonctionnetest.sh
comme un programme séparé. Il peut arriver que ce soit un script bash, si le fichiertest.sh
commence par#!/bin/bash
. Mais cela pourrait être tout à fait autre chose.. ./test.sh
exécute le code du fichiertest.sh
dans l'instance en cours d'exécution de bash. Cela fonctionne comme si le fichier de contenutest.sh
avait été inclus textuellement au lieu de la. ./test.sh
ligne. (Presque: il y a quelques détails qui diffèrent, tels que la valeur$BASH_LINENO
et le comportement de la commandereturn
intégrée.)source ./test.sh
est identique à. ./test.sh
in bash (dans d'autres shells,source
peut être légèrement différent ou ne pas exister du tout;.
pour l'inclure, il s'agit de la norme POSIX).La différence la plus visible entre l’exécution d’un script distinct
./test.sh
et l’inclusion d’un script avec l’.
intégré réside dans le fait que si letest.sh
script définit certaines variables d’environnement, avec un processus séparé, seul l’environnement du processus enfant est défini, tandis que lorsqu’un script est inclus, l’environnement du processus shell unique est défini. Si vous ajoutez une lignefoo=bar
danstest.sh
etecho $foo
à la fin du script d'appel, vous verrez la différence:la source
echo $$
au script montrera également la différence. La$$
variable contient le PID du shell actuel.. ./test.sh
appel provenant d'un autre script de shell pour utiliser les fonctions décrites dans test.sh. Je veux dire, ce ne sont pas seulement des variables que vous pouvez définir, vous pouvez également créer de nouvelles fonctions de cette manière, qui sont ensuite appelables à partir de bash, ou d'un autre script.. /usr/libexec/company/tools; custom_command "variable
"L'exécution initiale d'un script l'exécute en tant que processus enfant. La recherche de source (la seconde façon), en revanche, exécute le script comme si vous aviez entré toutes ses commandes dans le shell actuel. Si le script définit une variable, il le restera. Si le script se ferme, votre session se fermera. Voir
help .
pour la documentation.la source
Une autre chose que je remarque est que si vous avez un alias comme celui-ci:
Avec
./test.sh
vous obtiendrez unels
sortie normale (et un PID différent de celui du shell actuel):Avec
. test.sh
ou. ./test.sh
vous obtiendrez une sortie plus détaillée (et le même PID que le shell actuel):la source
.bashrc
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi
Ensuite, mettez vos alias dans.bash_aliases
.alias
mot clé? (Peut-être que c'est juste une erreur dans votre message - sur la ligne 3?)L'utilisation principale pour moi
source
(ou.
) est fonctions bash .J'ai des scripts avec beaucoup de fonctions et je les exécute tous avec mon
.bashrc
. Les fonctions "deviennent" des commandes que j'utilise souvent.la source