438 votes

Bash: Comment _best_ pour inclure d'autres scripts?

La façon dont vous le feriez normalement inclure un script est avec "la source"

par exemple:

main.sh:

#!/bin/bash

source incl.sh

echo "The main script"

incl.sh:

echo "The included script"

La sortie de l'exécution "./main.sh" est:

The included script
The main script

... Maintenant, si vous essayez d'exécuter ce script shell à partir d'un autre emplacement, il ne peut pas trouver le comprennent, sauf si elle est dans votre chemin.

Ce qui est une bonne façon de vous assurer que votre script peut trouver le script d'inclusion, en particulier si, par exemple, le script doit être portable?

262voto

Chris Boran Points 2414

J'ai tendance à faire mes scripts de tous les être par rapport à une autre. De cette façon, je peux utiliser dirname:

#!/bin/sh

my_dir="$(dirname "$0")"

"$my_dir/other_script.sh"

228voto

sacii Points 161

Je sais je suis en retard à la fête, mais cela devrait fonctionner, peu importe comment vous lancer le script et utilise des objets internes exclusivement:

DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. "$DIR/incl.sh"
. "$DIR/main.sh"

58voto

tardate Points 6809

Une alternative à:

scriptPath=$(dirname $0)

est:

scriptPath=${0%/*}

.. l'avantage étant de ne pas avoir la dépendance sur dirname, ce qui n'est pas une commande intégrée (et pas toujours disponible dans les émulateurs)

51voto

dsm Points 7429

Si c'est dans le même répertoire, vous pouvez utiliser dirname $0:

#!/bin/bash

source $(dirname $0)/incl.sh

echo "The main script"

22voto

Max Points 167
SRC=$(cd $(dirname "$0"); pwd)
source "${SRC}/incl.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