pwd
kann verwendet werden, um das aktuelle Arbeitsverzeichnis zu finden, und dirname
um das Verzeichnis einer bestimmten Datei zu finden (der Befehl, der ausgeführt wurde, ist $0
also dirname $0
sollte Ihnen das Verzeichnis des aktuellen Skripts anzeigen).
Allerdings, dirname
gibt genau den Verzeichnisteil des Dateinamens an, der höchstwahrscheinlich relativ zum aktuellen Arbeitsverzeichnis sein wird. Wenn Ihr Skript aus irgendeinem Grund das Verzeichnis wechseln muss, dann ist die Ausgabe von dirname
wird bedeutungslos.
Ich schlage Folgendes vor:
#!/bin/bash
reldir=`dirname $0`
cd $reldir
directory=`pwd`
echo "Directory is $directory"
Auf diese Weise erhalten Sie ein absolutes und nicht ein relatives Verzeichnis.
Da das Skript in einer separaten Bash-Instanz ausgeführt wird, ist es nicht notwendig, das Arbeitsverzeichnis anschließend wiederherzustellen, aber wenn Sie aus irgendeinem Grund in Ihrem Skript zurückwechseln möchten, können Sie einfach den Wert von pwd
in eine Variable einfügen, bevor Sie das Verzeichnis wechseln, um es später zu verwenden.
Obwohl nur
cd `dirname $0`
das spezifische Szenario in der Frage löst, finde ich die Angabe des absoluten Pfads generell nützlicher.
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"