137 votes

Référence à un fichier relatif à l'exécution de script.

Dans un script bash que je suis en train d'écrire, j'utilise source pour inclure la variable définie dans un fichier de configuration. Le script à exécuter est le suivant act.sh , tandis que le script à être source d est act.conf.sh , donc en act.sh Je l'ai fait :

source act.conf.sh

Cependant, cela ne fonctionne que lorsque l'on exécute act.sh dans le répertoire qui le contient, puisque act.conf.sh fait référence au fichier placé dans le répertoire de travail. Existe-t-il une solution pour faire référence au fichier relatif au script en cours d'exécution sans invoquer la commande cd ? Merci de votre réponse.

153voto

Ignacio Vazquez-Abrams Points 312628

Voir : Entrée FAQ BASH #28 : "Comment déterminer l'emplacement de mon script ? Je veux lire certains fichiers de configuration au même endroit."

Toute solution ne fonctionnera pas à 100 % :

Il est important de comprendre que dans le cas général, ce problème n'a pas de solution. Toutes les approches dont vous avez pu entendre parler, et toutes celles qui seront détaillées ci-dessous, présentent des lacunes et ne fonctionneront que dans des cas spécifiques. Avant tout, essayez d'éviter le problème en ne dépendant pas de l'emplacement de votre script !

Si vous devez écrire un très outil réutilisable, alors La méthode la plus fiable consiste à prendre le chemin correct comme paramètre de votre script. .

En supposant que votre script ne sera exécuté qu'à partir de certains shells, et seulement avec un peu de flexibilité, vous pouvez probablement relâcher un peu de cette paranoïa. Il est tout de même bon d'examiner les options qui s'offrent à vous. Il existe des schémas courants que les gens utilisent et qui sont particulièrement problématiques.

En particulier, la FAQ recommande d'éviter l'utilisation très courante de l'option $0 variable :

Rien qui ne se lise $0 ne sera jamais à l'épreuve des balles, car $0 n'est pas fiable.

En guise d'alternative, vous pouvez utiliser $BASH_SOURCE à la place. Quelque chose comme ça :

source "${BASH_SOURCE%/*}/act.conf.sh"

Cette solution présente également quelques inconvénients. Consultez la page FAQ pour voir les compromis entre les différentes solutions. Ils semblent recommander cd en combinaison avec $BASH_SOURCE dans les cas où cela fonctionnera pour vous, car vous obtiendrez une condition d'erreur pratique lorsqu'il ne se développera pas correctement.

42voto

vagovszkym Points 800

Voir cela : Bash : Comment inclure d'autres scripts ?

Je suggère d'utiliser :

source $(dirname $0)/act.conf.sh

14voto

Gayan Weerakutti Points 1989

Ajoutez ceci en plus du script. Ensuite, tout le code suivant sera exécuté par rapport à l'emplacement du script.

cd "$(dirname "${BASH_SOURCE[0]}")"

6voto

Clueless Points 2544

Essayez ce qui suit :

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X