it-swarm.com.de

Wie erhalte ich beim Schreiben eines Bash-Skripts den absoluten Pfad zum Speicherort der aktuellen Datei?

Angenommen, ich habe eine Bash-Datei namens myBash.bash. Es befindet sich in:

/myDirect/myFolder/myBash.bash

Jetzt möchte ich die Zeichenfolge /myDirect/myFolder (die Position von myBash.bash) im Skript verwenden. Gibt es einen Befehl, mit dem ich diesen Ort finden kann?

Bearbeiten: Die Idee ist, dass ich einen Zip-Ordner mit Code einrichten möchte, der von einem Bash-Skript in dieser Zip-Datei gestartet werden kann. Ich kenne die relativen Dateipfade des Codes in dieser Zip-Datei, aber nicht die absoluten Pfade, und ich brauche diese. Eine Möglichkeit wäre, den Pfad fest zu codieren oder den Pfad der Datei als Variable anzugeben. Ich würde es jedoch leichter finden, wenn die Bash-Datei selbst herausfinden könnte, wo sie sich befindet, und dann die relevanten Pfade zu der anderen Datei aus ihrem Wissen über die Struktur der Zip-Datei erstellen könnte.

11
dimpol

Sie können den vollständigen Pfad wie folgt abrufen:

realpath "$0"

Und als von Serg darauf hingewiesen können Sie dirname verwenden, um den Dateinamen wie folgt zu entfernen

dirname "$(realpath $0)"

oder noch besser, um unangenehme Anführungszeichen und das Teilen von Wörtern mit schwierigen Dateinamen zu vermeiden:

temp=$( realpath "$0"  ) && dirname "$temp"

Viel besser als meine frühere Idee, es zu analysieren (ich wusste, dass es einen besseren Weg geben würde!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'

Anmerkungen

  • realpath gibt den tatsächlichen Pfad einer Datei zurück
  • $0 ist diese Datei (das Skript)
  • s|old|new| ersetze old durch new
  • \(.*\)/ Speichern Sie alle Zeichen vor / für später
  • \1 der gespeicherte Teil
17
Zanna

wenn sich das Skript in Ihrem Pfad befindet, können Sie so etwas wie verwenden

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

BEARBEITEN: Nach dem Lesen von Kommentaren von Serg kann dies eine generische Lösung sein, die funktioniert, unabhängig davon, ob sich das Skript in Ihrem Pfad befindet oder nicht.

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"
5

Die akzeptierte Antwort scheint perfekt zu sein. Hier ist eine andere Möglichkeit:

cd "$(dirname "$0")"
/bin/pwd

/bin/pwd gibt den tatsächlichen Pfad des Verzeichnisses aus, im Gegensatz zum integrierten Befehl pwd.

4
serv-inc
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

Es wird als Referenz von Kenorb und Andro genommen
Kein Dirname, Readlink, Realpath, BASH_SOURCE
Alle sind eingebaut

0