Ich habe sie alle ausprobiert, aber keine hat funktioniert. Eines war sehr nahe dran, aber es hatte einen kleinen Fehler, der es kaputt machte; sie vergaßen, den Pfad in Anführungszeichen zu setzen.
Außerdem gehen viele Leute davon aus, dass Sie das Skript von einer Shell aus starten, und vergessen dabei, dass beim Öffnen eines neuen Skripts standardmäßig Ihr Heimatverzeichnis verwendet wird.
Probieren Sie dieses Verzeichnis einmal aus:
/var/No one/Thought/About Spaces Being/In a Directory/Name/And Here's your file.text
Damit wird es richtig gemacht, egal wie oder wo Sie es ausführen:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename "$0"`"
echo "dirname: `dirname "$0"`"
Um es also wirklich nützlich zu machen, wechseln Sie in das Verzeichnis des laufenden Skripts:
cd "`dirname "$0"`"
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"