web-dev-qa-db-fra.com

Récupère le chemin du script actuel lorsqu'il est exécuté via un lien symbolique

J'ai un utilitaire composé de quelques répertoires avec des scripts bash et des fichiers de support qui seront déployés sur plusieurs machines, éventuellement dans un répertoire différent sur chaque machine. Les scripts doivent être en mesure de référencer les chemins d'accès par rapport à eux-mêmes, je dois donc être en mesure d'obtenir le chemin d'accès au fichier en cours d'exécution.

Je connais le dirname $0 idiome qui fonctionne parfaitement lorsque mon script est appelé directement. Malheureusement, il existe un désir de pouvoir créer des liens symboliques vers ces scripts à partir d'un répertoire totalement différent tout en conservant la logique de cheminement relative.

Voici un exemple de la structure gouttière globale:

/
 |-usr/local/lib
 |  |-foo
 |  |  |-bin
 |  |  |  |-script.sh
 |  |  |-res
 |  |  |  |-resource_file.txt
 |-home/mike/bin
 |  |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)

Comment puis-je référencer de manière fiable /usr/local/lib/foo/res/resource_file.txt de script.sh si elle est invoquée par /usr/local/lib/foo/bin/script.sh ou ~mike/bin/link_to_script?

59
Mike Deck

Essayez ceci comme solution à usage général:

DIR="$(cd "$(dirname "$0")" && pwd)"

Dans le cas spécifique des liens symboliques suivants, vous pouvez également le faire:

DIR="$(dirname "$(readlink -f "$0")")"
83
Caleb

une ligne:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
8
diyism

readlink -f ne fonctionne pas pour moi, j'ai cette erreur:

readlink: illegal option -- f
usage: readlink [-n] [file ...]

Mais cela fonctionne bien:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR
4
Kevin Campion

Un petit ajout au script ci-dessus. L'option -P de pwd suit les liens symboliques

DIR="$(cd "$(dirname "$0")" && pwd -P)"
0
user2108420