Siehe: BASH FAQ-Eintrag Nr. 28: "Wie bestimme ich den Speicherort meines Skripts? Ich möchte einige Konfigurationsdateien von derselben Stelle aus lesen."
Jede Lösung wird nicht 100% der Zeit funktionieren:
Es ist wichtig zu wissen, dass dieses Problem im allgemeinen Fall keine Lösung hat. Jeder Ansatz, von dem Sie vielleicht schon gehört haben, und jeder Ansatz, der im Folgenden beschrieben wird, weist Mängel auf und funktioniert nur in bestimmten Fällen. Versuchen Sie in erster Linie, das Problem vollständig zu vermeiden, indem Sie nicht vom Speicherort Ihres Skripts abhängen!
Wenn Sie ein sehr wiederverwendbares Tool schreiben müssen, ist es die zuverlässigste Methode, den richtigen Pfad als Parameter für Ihr Skript zu verwenden .
Angenommen, Ihr Skript wird nur von bestimmten Shells ausgeführt und nur mit ein wenig Flexibilität können Sie wahrscheinlich einen Teil dieser Paranoia lockern. Es ist immer noch gut, sich Ihre Optionen anzusehen. Es gibt gängige Muster, die Menschen verwenden und die besonders problematisch sind.
In den häufig gestellten Fragen wird insbesondere empfohlen, die häufig verwendete $0
Variable zu vermeiden :
Nichts, was liest, $0
wird jemals kugelsicher sein, weil es $0
selbst unzuverlässig ist.
Alternativ können Sie $BASH_SOURCE
stattdessen verwenden. Etwas wie das:
source "${BASH_SOURCE%/*}/act.conf.sh"
Auch bei dieser Lösung gibt es einige Einschränkungen. Auf der FAQ-Seite finden Sie die Kompromisse zwischen verschiedenen Lösungen. Sie scheinen cd
in Kombination mit $BASH_SOURCE
in Fällen zu empfehlen, in denen es für Sie funktioniert, da Sie eine praktische Fehlerbedingung erhalten, wenn es nicht richtig erweitert wird.
readlink
. Konnte nicht die Schlüsselwörter bestimmen, nach denen gesucht werden soll, also postete die Frage hier ....cd "${BASH_SOURCE%/*}" || exit
oderread somevar < "${BASH_SOURCE%/*}/etc/somefile"
Link stark entmutigt$0
"Nichts, das $ 0 liest, wird jemals kugelsicher sein, weil $ 0 selbst unzuverlässig ist."Siehe dies: Bash: Wie kann ich andere Skripte am besten einschließen?
Ich schlage vor zu verwenden:
quelle
$0
ist von Natur aus fehlerhaft. Sehen Sie sich die am besten gewählte und akzeptierte Antwort an, warum, oder lesen Sie einfach mywiki.wooledge.org/BashFAQ/028 - kurze Problemumgehung für die gestellte Frage ist so etwas wiesource "${BASH_SOURCE%/*}/act.conf.sh"
Versuche Folgendes:
quelle