La dirname
commande est la plus simple, en analysant simplement le chemin jusqu'au nom de fichier de la $0
variable (nom du script):
dirname "$0"
Mais, comme l'a souligné matt b , le chemin renvoyé est différent selon la façon dont le script est appelé. pwd
ne fait pas le travail car cela vous indique uniquement le répertoire actuel, pas le répertoire dans lequel se trouve le script. De plus, si un lien symbolique vers un script est exécuté, vous obtiendrez un chemin (probablement relatif) vers où réside le lien, pas le script réel.
Certains autres ont mentionné la readlink
commande, mais dans sa plus simple expression, vous pouvez utiliser:
dirname "$(readlink -f "$0")"
readlink
résoudra le chemin du script en chemin absolu depuis la racine du système de fichiers. Ainsi, tous les chemins contenant des points simples ou doubles, des tildes et / ou des liens symboliques seront résolus en un chemin complet.
Voici un script illustrant chacun de ces éléments whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
Exécuter ce script dans mon répertoire personnel, en utilisant un chemin relatif:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Encore une fois, mais en utilisant le chemin d'accès complet au script:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Modification des répertoires:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Et enfin en utilisant un lien symbolique pour exécuter le script:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- et le supprimer sans substitution de commande -DIR="${DIR%x}"
.