Le site dirname
ist der einfachste Befehl, der einfach den Pfad bis zum Dateinamen aus der $0
(Name des Skripts) variieren:
dirname "$0"
Aber, wie matt b darauf hingewiesen, ist der zurückgegebene Pfad unterschiedlich, je nachdem, wie das Skript aufgerufen wird. pwd
erfüllt die Aufgabe nicht, da es nur das aktuelle Verzeichnis angibt, nicht aber das Verzeichnis, in dem sich das Skript befindet. Wenn ein symbolischer Link zu einem Skript ausgeführt wird, erhalten Sie außerdem einen (wahrscheinlich relativen) Pfad zu dem Verzeichnis, in dem sich der Link befindet, und nicht das eigentliche Skript.
Einige andere haben erwähnt, dass die readlink
Befehl, aber am einfachsten ist es, ihn zu verwenden:
dirname "$(readlink -f "$0")"
readlink
löst den Skriptpfad in einen absoluten Pfad vom Stamm des Dateisystems auf. Daher werden alle Pfade, die einfache oder doppelte Punkte, Tilden und/oder symbolische Links enthalten, in einen vollständigen Pfad aufgelöst.
Hier ist ein Skript, das jeden dieser Punkte 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))"
Ich führe dieses Skript in meinem Heimatverzeichnis aus und verwende einen relativen Pfad:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Wiederum 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 wechseln Sie die Verzeichnisse:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Und schließlich die Verwendung eines symbolischen Links zur Ausführung des Skripts:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
91 Stimmen
Keine der derzeitigen Lösungen funktioniert, wenn es irgendwelche Zeilenumbrüche am Ende des Verzeichnisnamens - Sie werden von der Befehlssubstitution entfernt. Um dies zu umgehen, können Sie ein Nicht-Neuzeilen-Zeichen innerhalb der Befehlsersetzung anhängen -
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- und entfernen Sie es ohne Befehlssubstitution -DIR="${DIR%x}"
.94 Stimmen
@jpmc26 Es gibt zwei sehr häufige Situationen: Unfälle und Sabotage. Ein Skript sollte nicht auf unvorhersehbare Weise versagen, nur weil jemand, irgendwo, eine
mkdir $'\n'
.36 Stimmen
Wer Leute sein System auf diese Weise sabotieren lässt, sollte es nicht der Bash überlassen, solche Probleme zu erkennen... und schon gar nicht Leute einstellen, die zu solchen Fehlern fähig sind. Ich habe in den 25 Jahren, in denen ich die Bash benutze, noch nie erlebt, dass so etwas irgendwo passiert.... Deshalb gibt es Dinge wie Perl und Praktiken wie Taint Checking (ich werde wahrscheinlich dafür geflamed werden, dass ich das sage :)
79 Stimmen
Ich empfehle Ihnen, dies zu lesen Bash FAQ über das Thema.
0 Stimmen
"${PWD%/}/application"