Le dirname de commande est le plus simple, il suffit de l'analyse du chemin pour le nom de fichier hors de la $0 (nom du script) de la variable:
dirname "$0"
Mais, comme matt b a souligné, le chemin retourné est différent selon la façon dont le script est appelé. pwd ne pas faire le travail parce que ne vous raconte pas ce que le répertoire courant est, pas ce répertoire que le script réside dans. En outre, si un lien symbolique vers un script est exécuté, vous allez avoir un (probablement relative) chemin d'accès où le lien réside, non pas le script.
D'autres ont mentionné la readlink de commande, mais c'est plus simple, vous pouvez utiliser:
dirname "$(readlink -f "$0")"
readlink permettra de résoudre le script chemin d'accès à un chemin absolu de la racine du système de fichiers. Ainsi, tous les chemins contenant des simple ou double de points, les tildes et/ou des liens symboliques seront résolus d'un chemin d'accès complet.
Voici un script démontrant chacun de ces, 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))"
L'exécution de ce script dans mon répertoire home, 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 complet du script:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Maintenant modifier les 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, à l'aide d'un lien symbolique afin d'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