Comment inclure un fichier dans un script shell bash

122

Existe-t-il un moyen d'inclure un autre script shell dans un script shell pour pouvoir accéder à ses fonctions?

Comme comment en PHP, vous pouvez utiliser la includedirective avec d'autres fichiers PHP afin d'exécuter les fonctions qui y sont contenues simplement en appelant le nom de la fonction.

Méchaflash
la source
duplication possible de Bash: comment inclure au mieux d'autres scripts?
Troubadour
@Troubadour merci pour la référence. Même si l'article fait référence à la sourcecommande, la question en soi est de savoir comment localiser l'emplacement d'un sourcefichier.
Mechaflash
1
Les «questions fondamentales» sont le catalyseur du débordement de pile. Vous comprenez que ce site est indexé comme n'importe quel autre site, et maintenant "comment inclure un fichier dans un script shell bash" apparaîtra sur Google en lien avec le débordement de pile, augmentant ainsi le trafic et l'exposition du site. = D
Mechaflash
3
Vous êtes intelligent! Merci votre génialité!
Mechaflash
4
@Troubadour, c'est idiot de dire que l'utilisateur aurait dû chercher la réponse sur Google, alors que c'est exactement comme ça que je suis arrivé à la page. Par exemple, aujourd'hui, cette question spécifique était le meilleur résultat Google pour "bash include file". Dois-je ignorer cette réponse pour trouver une autre solution?
lwitzel

Réponses:

193

Mettez simplement dans votre script:

source FILE

Ou

. FILE # POSIX compliant

$ LANG=C help source
source: 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.
Gilles Quenot
la source
17
Notez que . est conforme POSIX alors que la source ne l'est pas
Mathieu_Du
Mais ici, la source n'est pas exactement la même chose que nous le faisons dans la Clangue. Ici, la source exécute le script enfant dans le script principal. Que faire si je souhaite simplement appeler une fonction particulière à partir du script enfant?
Paresh Mayani
8
Ne confondez pas . script.shavec ./script.sh. J'ai perdu des heures à essayer de comprendre ce qui se passe
Tihomir Mitkov
Tandis que . est compatible POSIX, ce qui signifie qu'il fonctionnera sur sh, dash, zsh et autres shells POSIX. Il vaut mieux utiliser. car certains shells ont leur propre version, similaire, mais un peu différente de "source" qui peut casser votre application.
Jacob Korba le
51

Les réponses ci-dessus sont correctes, mais si vous exécutez le script dans un autre dossier, il y aura un problème.

Par exemple, les a.shet b.shsont dans le même dossier, a include b avec . ./b.shpour inclure.

Lorsque script exécuté sur le dossier, par exemple avec xx/xx/xx/a.sh, le fichier b.shne sera pas trouvé: ./b.sh: No such file or directory.

j'utilise

. $(dirname "$0")/b.sh
Fancyoung
la source
33

Oui, utilisez la source ou la forme courte qui est juste .:

. other_script.sh
Paul
la source
3
Notez que la .version fonctionne shaussi bien que sur Bash. Le "source" ne fonctionne que dans Bash.
Sridhar Sarnobat
2

Dans ma situation, afin d'inclure à color.shpartir du même répertoire dans init.sh, je devais faire quelque chose comme suit.

. ./color.sh

Je ne sais pas pourquoi ./et pas color.shdirectement. Le contenu de color.shest le suivant.

RED=`tput setaf 1`
GREEN=`tput setaf 2`
BLUE=`tput setaf 4`
BOLD=`tput bold`
RESET=`tput sgr0`

L'utilisation de File color.shne fait pas d'erreur, mais la couleur ne s'affiche pas. J'ai testé ceci Ubuntu 18.04et la Bashversion est:

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

Raf
la source
Cela vous donnera simplement le fichier dans votre répertoire de travail actuel, pas le répertoire où se init.shtrouve (ils coïncident si vous l'avez lancé avec./init.sh en premier lieu).
ricab