771 Stimmen

Wie erkenne ich den Namen der Skriptdatei in einem Bash-Skript?

Wie kann ich den Namen der Bash-Skriptdatei im Skript selbst ermitteln?

Wenn mein Skript zum Beispiel in der Datei runme.sh Wie kann ich dann dafür sorgen, dass die Meldung "Sie führen runme.sh aus" angezeigt wird, ohne dies fest zu kodieren?

3 Stimmen

Ähnlich [Kann ein Bash-Skript sagen, in welchem Verzeichnis es gespeichert ist?](zu stackoverflow.com/questions/59895/ )

1 Stimmen

11voto

simon Punkte 13817

Re: Tanktalus' (akzeptierte) Antwort oben, eine etwas sauberere Methode ist die Verwendung:

me=$(readlink --canonicalize --no-newline $0)

Wenn Ihr Skript von einem anderen Bash-Skript abgeleitet wurde, können Sie verwenden:

me=$(readlink --canonicalize --no-newline $BASH_SOURCE)

Ich stimme zu, dass es verwirrend wäre, Symlinks zu derefenzieren, wenn man dem Benutzer eine Rückmeldung geben will, aber es gibt Gelegenheiten, bei denen man den kanonischen Namen eines Skripts oder einer anderen Datei braucht, und das ist imo der beste Weg.

1 Stimmen

Danke für source d Skriptnamen.

11voto

Nishant Punkte 18752

Dies funktioniert gut mit ./self.sh , ~/self.sh , source self.sh , source ~/self.sh :

#!/usr/bin/env bash

self=$(readlink -f "${BASH_SOURCE[0]}")
basename=$(basename "$self")

echo "$self"
echo "$basename"

Kredite: Ich habe mehrere Antworten kombiniert, um diese Antwort zu erhalten.

3 Stimmen

$(readlink -f "${BASH_SOURCE[0]}") funktioniert nur, wenn Sie die Bash verwenden. $(readlink -f "${BASH_SOURCE:-$0}") funktioniert trotzdem.

10voto

jcalfee314 Punkte 4100
this="$(dirname "$(realpath "$BASH_SOURCE")")"

Dies löst symbolische Links auf (realpath macht das), behandelt Leerzeichen (doppelte Anführungszeichen machen das), und findet den aktuellen Skriptnamen, auch wenn er als Quelle (. ./myscript) oder von anderen Skripten aufgerufen wird ($BASH_SOURCE macht das). Nach all dem ist es gut, dies in einer Umgebungsvariablen zur Wiederverwendung oder zum einfachen Kopieren an anderer Stelle zu speichern (this=)...

4 Stimmen

ZU IHRER INFORMATION realpath ist kein eingebauter BASH-Befehl. Es handelt sich um eine eigenständige ausführbare Datei, die nur in bestimmten Distributionen verfügbar ist

0 Stimmen

Kann das bestätigen, in meiner 14.04 Box ist es nicht verfügbar und ich musste die readlink stattdessen

9voto

VolkA Punkte 31963

Sie können $0 verwenden, um Ihren Skriptnamen (mit vollständigem Pfad) zu bestimmen - um nur den Skriptnamen zu erhalten, können Sie diese Variable mit

basename $0

8voto

LawrenceLi Punkte 379

Wenn Sie ein Shell-Skript aufrufen wie

/home/mike/runme.sh

$0 ist der vollständige Name

 /home/mike/runme.sh

basename $0 liefert den Namen der Basisdatei

 runme.sh

und Sie müssen diesen Basisnamen in eine Variable wie

filename=$(basename $0)

und fügen Sie Ihren zusätzlichen Text hinzu

echo "You are running $filename"

so dass Ihre Skripte wie

/home/mike/runme.sh
#!/bin/bash 
filename=$(basename $0)
echo "You are running $filename"

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