Quelle est la différence entre l'utilisation de " sh " et "source"?
Quelle est la différence entre sh
et source
?
source: source filename [arguments]
Read and execute commands from FILENAME and return. The pathnames
in $PATH are used to find the directory containing FILENAME. If any
ARGUMENTS are supplied, they become the positional parameters when
FILENAME is executed.
Et pour man sh
:
NAME
bash - GNU Bourne-Again SHell
SYNOPSIS
bash [options] [file]
COPYRIGHT
Bash is Copyright (C) 1989-2004 by the Free Software Foundation, Inc.
DESCRIPTION
Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates
useful features from the Korn and C shells (ksh and csh).
Bash is intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).
Vous devez vous connecter pour publier un commentaire.
Lorsque vous appelez
source
(ou son alias.
), vous insérer le script dans le actuel bash processus. Donc, vous pouvez lire des variables définies par le script.Lorsque vous appelez
sh
, vous lancez une fourche (sous-processus) qui exécute une nouvelle session de/bin/sh
, qui est généralement un lien symbolique versbash
. Dans ce cas, les variables d'environnement définies par le sous-script serait tombé dans le sous-script se termine.Attention:
sh
pourrait être un lien symbolique vers un autre shell.Un petit échantillon
Par exemple, si vous souhaitez modifier répertoire de travail courant par une manière spécifique, vous ne pouviez pas faire
Cela ne fera pas ce que vous attendez:
parce que de travail en cours dir fait partie de l'environnement et de
myCd2Doc.sh
s'exécuter dans un shell interne est exécuté.Mais:
(J'ai écrit un petit échantillon de
mycd
fonction.)Niveau de l'exécution
$SHLVL
Peu la récursivité
Et un final test:
... Vous remarquerez peut-être un différents de comportement entre les deux syntaxe. 😉
La principale différence est que ils sont exécutés dans un processus différent.
Donc, si vous
source
un fichierfoo
qui ne uncd
, le sourcing shell (par exemple, votre shell interactif dans le terminal) est affecté (et son répertoire en cours de changement)Si vous exécutez
sh foo
lacd
n'a pas d'incidence sur l'approvisionnement en shell, seulement fraîchement crééesh
processus en cours d'exécutionfoo
Lire la Advanced Bash Scripting Guide.
Que la différence n'est pas spécifique à Linux; chaque Posix mise en œuvre aurait-il.
Comme d'autres l'ont mentionné, lorsque vous exécutez
sh test.sh
, toutes les modifications quetest.sh
rend à votre environnement de shell de ne pas persister après le processus est terminé.Cependant, veuillez noter que tout élément de votre environnement qui n'est pas exporté (par exemple, les variables, les alias et les fonctions d'interpréteur de commandes) ne sont pas disponibles pour le code dans
test.sh
lorsqu'il est exécuté comme un sous-processus (c'est à dire avecsh test.sh
).Par exemple:
Exemple 2:
Lorsque vous exécutez un programme avec la commande sh:
et lorsque vous utilisez la commande source :
sh
(par exemplesh test.sh
). Vous n'aurez besoin que si vous souhaitez appeler directement (par exemple,./test.sh
).