GNU/Linux >> Tutoriels Linux >  >> Linux

Comment un script bash peut-il connaître le répertoire dans lequel il est installé lorsqu'il est sourcé avec . opérateur?

Je crois $(dirname "$BASH_SOURCE") fera ce que vous voulez, tant que le fichier que vous recherchez n'est pas un lien symbolique.

Si le fichier que vous recherchez peut être un lien symbolique, vous pouvez faire quelque chose comme ceci pour obtenir le vrai répertoire :

PRG="$BASH_SOURCE"
progname=`basename "$BASH_SOURCE"`

while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done

dir=$(dirname "$PRG")

Voici ce qui pourrait être une solution élégante :

script_path="${BASH_SOURCE[0]}"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"

Cependant, cela ne fonctionnera pas lors de la recherche de liens. Dans ce cas, on pourrait faire

script_path="$(readlink -f "$(readlink "${BASH_SOURCE[0]}")")"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"

À noter :

  • des tableaux comme ${array[x]} ne sont pas compatibles POSIX - mais alors, le BASH_SOURCE tableau n'est disponible que dans Bash, de toute façon
  • sur macOS, le BSD natif readlink ne prend pas en charge -f , vous devrez donc peut-être installer GNU readlink en utilisant par ex. infuser par brew install coreutils et remplacer readlink par greadlink
  • selon votre cas d'utilisation, vous pouvez utiliser le -e ou -m commutateurs au lieu de -f plus éventuellement -n; voir la page de manuel readlink pour plus de détails

Une approche différente du problème - si vous utilisez "." afin de définir des variables d'environnement, une autre façon standard de le faire est d'avoir vos commandes de définition de variables d'écho de script, par exemple :

# settings.sh
echo export CLASSPATH=${CLASSPATH}:/foo/bar

puis évaluez la sortie :

eval $(/path/to/settings.sh)

C'est ainsi que fonctionnent les paquets comme les modules. De cette manière, il est également facile de prendre en charge les shells dérivés de sh (X=...; export X ) et csh (setenv X ... )


Linux
  1. Comment définir les paramètres lorsque Pipe Bash Script to Bash ?

  2. Correction du script Bash attendant une entrée de chemin avec / à la fin se cassant lorsque le chemin ne se termine pas par /?

  3. Comment puis-je utiliser Bash comme shell de connexion lorsque l'administrateur système refuse de me laisser le changer ?

  4. Comment connaître le nom du fichier de script dans un script Bash ?

  5. Comment obtenir le répertoire absolu d'un fichier dans bash ?

Comment écrire un script bash avec des exemples

Comment arrêter le script Loop Bash dans le terminal ?

Dans un script bash, comment la commande Continuer fonctionne-t-elle avec les boucles intégrées ?

Comment puis-je installer le dernier Anaconda avec wget

Comment exécuter un script bash ?

Comment exécuter automatiquement un script lorsque le contenu d'un répertoire change sous Linux ?