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 pouvoir référencer des chemins relatifs par rapport à eux-mêmes, donc je dois pouvoir obtenir le chemin du fichier en cours d'exécution.
Je suis conscient du dirname $0
langage qui fonctionne parfaitement lorsque mon script est appelé directement. Malheureusement, il est souhaitable de pouvoir créer des liens symboliques vers ces scripts à partir d'un répertoire totalement différent tout en maintenant la logique de cheminement relatif.
Voici un exemple de la structure globale du driectory:
/
|-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érence fiable /usr/local/lib/foo/res/resource_file.txt
de script.sh
savoir si elle est invoquée par /usr/local/lib/foo/bin/script.sh
ou ~mike/bin/link_to_script
?
la source
source
d (par exemple$ source ./sript.sh
) . Cela fonctionne dans les deux cas:DIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"
une ligne:
la source
readlink -f
ne fonctionne pas pour moi, j'ai cette erreur:Mais cela fonctionne bien:
la source
Un petit ajout au script ci-dessus. L'option -P de pwd suit les liens symboliques
la source