6176 Stimmen

Wie kann ich das Quellverzeichnis eines Bash-Skripts aus dem Skript selbst abrufen?

Wie erhalte ich den Pfad des Verzeichnisses, in dem ein Bash Skript befindet sich, innerhalb dieses Drehbuch?

Ich möchte ein Bash-Skript als Launcher für eine andere Anwendung verwenden. Ich möchte das Arbeitsverzeichnis in das Verzeichnis ändern, in dem sich das Bash-Skript befindet, damit ich mit den Dateien in diesem Verzeichnis arbeiten kann:

$ ./application

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 :)

-1voto

konsolebox Punkte 66082

Keine Verzweigungen (außer Subshell) und kann mit "fremden" Pfadnamenformen wie denen mit Zeilenumbrüchen umgehen, wie einige behaupten würden:

IFS= read -rd '' DIR < <([[ $BASH_SOURCE != */* ]] || cd "${BASH_SOURCE%/*}/" >&- && echo -n "$PWD")

-1voto

Stefano Borini Punkte 132313
function getScriptAbsoluteDir { # fold>>
    # @description used to get the script path
    # @param $1 the script $0 parameter
    local script_invoke_path="$1"
    local cwd=`pwd`

    # absolute path ? if so, the first character is a /
    if test "x${script_invoke_path:0:1}" = 'x/'
    then
        RESULT=`dirname "$script_invoke_path"`
    else
        RESULT=`dirname "$cwd/$script_invoke_path"`
    fi
} # <<fold

0 Stimmen

Sorry, ich bin ein bisschen ein Bash Scrip Noob, rufe ich diese Funktion durch die Eingabe von nur getScriptAbsoluteDir o local currdir='getScriptAbsoluteDir' ?

4 Stimmen

-1: Die function Schlüsselwort ist auf POSIX-Shells nicht verfügbar und ist eine unnötig inkompatible bash/ksh/&c. Erweiterung. Wenn Sie auf einer Shell sind, die neu genug ist, um diese Erweiterung zu haben, brauchen Sie den "x[...]"-Hack nicht.

0 Stimmen

Das sieht fast wie Python aus... Ich kann mich nicht daran erinnern, dass ich jemals das Schlüsselwort "local" in einem Shell-Skript verwendet habe... Und zu dem, was Charles sagte, verwenden Sie if [[ "${script_invoke_path:0:1}" == "/" ]]; then und so weiter. Beachten Sie das logische Doppel == Operator "gleich".

-2voto

Nam G VU Punkte 30552

Basierend auf diese Antwort schlage ich die geklärte Version vor, die SCRIPT_HOME als den Ordner, in dem sich das aktuell ausgeführte Bash-Skript befindet:

s=${BASH_SOURCE[0]} ; s=`dirname $s` ; SCRIPT_HOME=`cd $s ; pwd`
echo $SCRIPT_HOME

-3voto

bestOfSong Punkte 71

Ich möchte die vorherige Antwort dort oben kommentieren ( Wie kann ich das Quellverzeichnis eines Bash-Skripts aus dem Skript selbst abrufen? ), haben aber nicht genug Ansehen, um das zu tun.

Ich habe vor zwei Jahren auf der Dokumentationsseite von Apple eine Lösung für dieses Problem gefunden: https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/AdvancedTechniques/AdvancedTechniques.html . Und ich bin danach bei dieser Methode geblieben. Sie kann zwar nicht mit Softlinks umgehen, aber ansonsten funktioniert sie bei mir recht gut. Ich poste es hier für alle, die es brauchen, und als Bitte um Kommentare.

#!/bin/sh

# Get an absolute path for the poem.txt file.
POEM="$PWD/../poem.txt"

# Get an absolute path for the script file.
SCRIPT="$(which $0)"
if [ "x$(echo $SCRIPT | grep '^\/')" = "x" ] ; then
    SCRIPT="$PWD/$SCRIPT"
fi

Wie der Code zeigt, können Sie, nachdem Sie den absoluten Pfad des Skripts erhalten haben, die Funktion dirname Befehl, um den Pfad des Verzeichnisses zu erhalten.

-3voto

ankostis Punkte 7409

Este Einzeiler arbeitet an Cygwin auch dann, wenn das Skript aufgerufen wurde von Windows con bash -c <script> :

set mydir="$(cygpath "$(dirname "$0")")"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X