dirname
Komenda jest najbardziej podstawowym, po prostu parsowania ścieżkę do pliku off z $0
zmienna (nazwa skryptu):
dirname "$0"
Ale, jak zauważył Matt B , zwrócona ścieżka różni się w zależności od sposobu wywołania skryptu. pwd
nie wykonuje zadania, ponieważ mówi tylko o tym, jaki jest bieżący katalog, a nie katalog, w którym znajduje się skrypt. Ponadto, jeśli zostanie wykonane dowiązanie symboliczne do skryptu, otrzymasz ścieżkę (prawdopodobnie względną) do gdzie znajduje się link, a nie rzeczywisty skrypt.
Inni wspomnieli o readlink
poleceniu, ale najprościej możesz użyć:
dirname "$(readlink -f "$0")"
readlink
rozwiąże ścieżkę skryptu do ścieżki bezwzględnej z katalogu głównego systemu plików. Zatem wszelkie ścieżki zawierające pojedyncze lub podwójne kropki, tyldy i / lub dowiązania symboliczne zostaną przekształcone w pełną ścieżkę.
Oto skrypt demonstrujący każdy z nich 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))"
Uruchomienie tego skryptu w moim katalogu domowym przy użyciu ścieżki względnej:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Ponownie, ale używając pełnej ścieżki do skryptu:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Teraz zmieniamy katalogi:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
I na koniec używając linku symbolicznego do wykonania skryptu:
>>>$ 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)"
- i usunąć go bez podstawienia polecenia -DIR="${DIR%x}"
.