Ich glaube nicht, dass es so einfach ist, wie andere es dargestellt haben. pwd
funktioniert nicht, da das aktuelle Verzeichnis nicht unbedingt das Verzeichnis ist, in dem sich das Skript befindet. $0
hat auch nicht immer die nötigen Informationen. Betrachten Sie die folgenden drei Möglichkeiten, ein Skript aufzurufen:
./script
/usr/bin/script
script
Auf die erste und dritte Art $0
nicht über die vollständigen Pfadinformationen verfügt. In der zweiten und dritten, pwd
funktioniert nicht. Die einzige Möglichkeit, das Verzeichnis auf die dritte Art zu erhalten, wäre, den Pfad zu durchlaufen und die Datei mit der richtigen Übereinstimmung zu finden. Im Grunde müsste der Code wiederholen, was das Betriebssystem tut.
Eine Möglichkeit, das zu tun, was Sie wollen, wäre, die Daten einfach in der /usr/share
und referenzieren Sie es über seinen vollständigen Pfad. Die Daten sollten sich nicht in der /usr/bin
Das ist also wahrscheinlich die richtige Vorgehensweise.
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"