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 einfacher finden, wenn es der Bash-Datei möglich wäre, herauszufinden, wo sie sich selbst befindet, und dann die relevanten Pfade zur anderen Datei aus ihrem Wissen über die Struktur der Zip-Datei zu erstellen.
quelle
Antworten:
Sie können den vollständigen Pfad wie folgt erhalten:
Und wie Serg betont hat, können Sie
dirname
den Dateinamen so entfernenoder noch besser, um umständliches Zitieren und Aufteilen von Wörtern mit schwierigen Dateinamen zu vermeiden:
Viel besser als meine frühere Idee, es zu analysieren (ich wusste, dass es einen besseren Weg geben würde!)
Anmerkungen
realpath
Gibt den tatsächlichen Pfad einer Datei zurück$0
ist diese Datei (das Skript)s|old|new|
ersetzenold
durchnew
\(.*\)/
Speichern Sie alle Zeichen vorher/
für später\1
das gespeicherte Teilquelle
$0
undsed
Magie. Aber die besagtesed
Magie ist wirklich unnötig, wenn Werkzeuge wiedirname
existierenrealpath
:realpath "$( dirname $0 )"
Ich persönlich würde verwenden,readlink
aber das bin ich:readlink -e $(dirname $0)
dirname "$(realpath "$0")"
besser? Normalerweise möchte man das übergeordnete Verzeichnis der referenzierten Datei anstelle des übergeordneten Verzeichnisses des symbolischen Links kennen, der auf diese Datei verweist."$(dirname "$(realpath "$0")")"
ist der einfachste Weg. Zitate im Inneren$()
funktionieren wie gewohnt.$()
Wenn Sie eine Subshell sind, können Sie Zitate im Freien haben. Ich würde nicht sagen, dass es so einfach ist, es sei denn, man merkt, dass$()
alle Unterschalen sindWenn sich das Skript in Ihrem Pfad befindet, können Sie so etwas wie verwenden
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.
quelle
which
ist besser geeignet, wenn sich das Skript in einem der Verzeichnisse befindet, die Teil derPATH
Variablen sind. Verwenden Sie es$0
aus einem Skript heraus, genau wie Zanna es zeigt. Aber Ihre Antwort ist richtig, da Sie verwenden,dirname
anstatt sich damit zu beschäftigensed
, daher +1 dafürDie akzeptierte Antwort scheint perfekt zu sein. Hier ist eine andere Möglichkeit:
/bin/pwd
pwd
Gibt den tatsächlichen Pfad des Verzeichnisses im Gegensatz zum integrierten Befehl aus.quelle
Es wird als Referenz von kenorb und andro verwendet.
Kein dirname, readlink, realpath, BASH_SOURCE
Alle sind eingebaut
quelle