Der dirname
Befehl ist der einfachste und analysiert einfach den Pfad bis zum Dateinamen aus der $0
Variablen (Skriptname):
dirname "$0"
Wie matt b hervorhob, ist der zurückgegebene Pfad jedoch unterschiedlich, je nachdem, wie das Skript aufgerufen wird. pwd
führt den Job nicht aus, da dies nur angibt, in welchem Verzeichnis sich das aktuelle Verzeichnis befindet und nicht in welchem Verzeichnis sich das Skript befindet. Wenn außerdem eine symbolische Verknüpfung zu einem Skript ausgeführt wird, erhalten Sie einen (wahrscheinlich relativen) Pfad zu Wo sich der Link befindet, nicht das eigentliche Skript.
Einige andere haben den readlink
Befehl erwähnt, aber im einfachsten Fall können Sie Folgendes verwenden:
dirname "$(readlink -f "$0")"
readlink
löst den Skriptpfad in einen absoluten Pfad vom Stammverzeichnis des Dateisystems auf. Alle Pfade, die einfache oder doppelte Punkte, Tildes und / oder symbolische Links enthalten, werden in einen vollständigen Pfad aufgelöst.
Hier ist ein Skript, das jedes dieser Elemente demonstriert 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))"
Ausführen dieses Skripts in meinem Ausgangsverzeichnis unter Verwendung eines relativen Pfads:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Nochmals, aber unter Verwendung des vollständigen Pfads zum Skript:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Jetzt Verzeichnisse wechseln:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Und schließlich einen symbolischen Link verwenden, um das Skript auszuführen:
>>>$ 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)"
- und es ohne Befehlsersetzung entfernen -DIR="${DIR%x}"
.