Wie setze ich das aktuelle Arbeitsverzeichnis auf das Verzeichnis des Skripts?

Ich schreibe ein Bash-Skript. Ich brauche das aktuelle Arbeitsverzeichnis, um immer das Verzeichnis zu sein, in dem sich das Skript befindet.

Das Standardverhalten ist, dass das aktuelle Arbeitsverzeichnis im Skript das der Shell ist, von der ich es aus führe, aber ich möchte dieses Verhalten nicht.

 #!/bin/bash cd "$(dirname "$0")" 

Folgendes funktioniert auch:

 cd "${0%/*}" 

Die Syntax wird in dieser StackOverflow-Antwort ausführlich beschrieben.

Probieren Sie die folgenden einfachen Einzeiler aus:


Für alle UNIX / OSX / Linux

 dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) 

Hinweis: Ein Doppelstrich (-) wird in Befehlen verwendet, um das Ende von Befehlsoptionen zu kennzeichnen, sodass Dateien, die Bindestriche oder andere Sonderzeichen enthalten, den Befehl nicht unterbrechen.


Für Linux, Mac und andere * BSD:

 cd $(dirname $(realpath $0)) 

Mit Leerzeichen unterstützen:

 cd "$(dirname "$(realpath "$0")")"; 

Hinweis: realpath sollte standardmäßig in der gängigsten Linux-Distribution (wie Ubuntu) installiert sein, aber in einigen realpath kann es fehlen, also müssen Sie es installieren.

Sonst könnte man so etwas versuchen (es wird das erste existierende Werkzeug verwenden):

 cd $(dirname $(readlink -f $0 || realpath $0)) 

Für Linux spezifisch:

 cd $(dirname $(readlink -f $0)) 

Mit GNU Readlink auf * BSD / Mac:

 cd $(dirname $(greadlink -f $0)) 

Hinweis: Sie müssen coreutils installiert haben (z. B. 1. Homebrew brew install coreutils , 2. brew install coreutils ).


In der Bash

In bash können Sie Parametererweiterungen verwenden , um Folgendes zu erreichen:

 cd ${0%/*} 

aber es funktioniert nicht, wenn das Skript aus demselben Verzeichnis ausgeführt wird.

Alternativ können Sie die folgende function in bash definieren:

 realpath () { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" } 

Diese function benötigt 1 Argument. Wenn das Argument bereits einen absoluten Pfad hat, drucke es so, wie es ist, andernfalls drucke $PWD Variable + Dateiname Argument (ohne ./ Präfix).

oder hier ist die Version aus Debian .bashrc Datei:

 function realpath() { f=$@ if [ -d "$f" ]; then base="" dir="$f" else base="/$(basename "$f")" dir=$(dirname "$f") fi dir=$(cd "$dir" && /bin/pwd) echo "$dir$base" } 

Verbunden:

  • Wie finde ich das aktuelle Verzeichnis, in dem ich mein Shell-Skript ausführe?

  • Das Quellverzeichnis eines Bash-Skripts von innen holen

  • Absoluter Bash-Skriptpfad mit OSX

  • Zuverlässige Methode für ein Bash-Skript, um den vollständigen Pfad zu sich selbst zu erhalten?

Siehe auch:

Wie bekomme ich das Verhalten von GNU’s Readlink -f auf einem Mac?

 cd "$(dirname ${BASH_SOURCE[0]})" 

Es ist einfach. Es klappt.

Dieses Skript scheint für mich zu funktionieren:

 #!/bin/bash mypath=`realpath $0` cd `dirname $mypath` pwd 

Die pwd-Befehlszeile gibt den Speicherort des Skripts als aktuelles Arbeitsverzeichnis wieder, unabhängig davon, wo ich es ausführe.

Holen Sie sich den richtigen Pfad zu Ihrem Skript

 if [ -L $0 ] ; then ME=$(readlink $0) else ME=$0 fi DIR=$(dirname $ME) 

(Dies ist die Antwort auf meine Frage hier: Holen Sie den Namen des Verzeichnisses, in dem ein Skript ausgeführt wird )

 cd "`dirname $(readlink -f ${0})`" 

Die akzeptierte Antwort funktioniert gut für Skripts, die nicht anderweitig verlinkt wurden, z. B. in $PATH .

 #!/bin/bash cd "$(dirname "$0")" 

Wenn das Skript jedoch über einen Symlink ausgeführt wird,

 ln -sv ~/project/script.sh ~/bin/; ~/bin/script.sh 

Dies wird in das Verzeichnis ~/bin/ und nicht in das Verzeichnis ~/project/ kopiert, was wahrscheinlich das Skript zerstört, wenn der Zweck der cd besteht, Abhängigkeiten zu ~/project/

Die symlink sichere Antwort ist unten:

 #!/bin/bash cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" 

readlink -f wird benötigt, um den absoluten Pfad der potenziell symbolisierten Datei aufzulösen.

Die Anführungszeichen sind erforderlich, um Dateipfade zu unterstützen, die möglicherweise Leerzeichen enthalten können (schlechte Praxis, aber es ist nicht sicher anzunehmen, dass dies nicht der Fall sein wird).

 echo $PWD 

PWD ist eine Umgebungsvariable.

Wenn Sie nur das aktuelle Arbeitsverzeichnis drucken müssen, können Sie dem folgen.

 $ vim test #!/bin/bash pwd :wq to save the test file. 

Gib Ausführungsberechtigung:

 chmod u+x test 

./test Sie das Skript dann mit ./test dann können Sie das aktuelle Arbeitsverzeichnis sehen.