In einem Skript komme ich auf $0
den möglichen relativen Pfad dazu. Um es in absolut umzuwandeln, habe ich diese Lösung gefunden, die ich nicht verstehe:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Mein Problem ist die Magie in ${0%/*}
und ${0##*/}
. Es sieht so aus, als ob der erstere den Verzeichnisnamen und der letztere den Dateinamen extrahiert. Ich verstehe nur nicht, wie.
readlink -f $0
Sie den kanonischen Pfad abrufen.dirname
util ist hier nützlich.BASH_SOURCE
sei besser als$0
, da$0
der eingegebene Befehl des Benutzers angegeben wird, der möglicherweise nicht das aktuell ausgeführte Skript ist.Antworten:
Definitionen:
${string%substring}
löscht die kürzeste Übereinstimmung$substring
von am Ende von$string
.${string##substring}
löscht die längste Übereinstimmung von$substring
Anfang an$string
.Ihr Beispiel:
${0%/*}
löscht alles nach dem letzten Schrägstrich und gibt Ihnen den Verzeichnisnamen des Skripts (möglicherweise ein relativer Pfad).${0##*/}
löscht alles bis zum letzten Schrägstrich und gibt nur den Namen des Skripts an.Dieser Befehl wechselt also in das Verzeichnis des Skripts und verkettet das aktuelle Arbeitsverzeichnis (angegeben durch
$PWD
) und den Namen des Skripts, wobei Sie den absoluten Pfad angeben .Um zu sehen, was los ist, versuchen Sie:
quelle
Shawn hatte die einfachste Lösung :
readlink -f $0
. Wenn Sie absolut sicher sein möchten, mit seltsamen Dateinamen umzugehen, können Sie Folgendes verwenden:Dokumentation
quelle
readlink -fn
ist spezifisch für Linux, NetBSD und OpenBSD.Hier ist eine sicherere und besser lesbare Möglichkeit, diesen Job zu erledigen:
Anmerkungen:
$0
es sich um einen bloßen Dateinamen ohne vorhergehenden Pfad handelt, schlägt das ursprüngliche Skript fehl, aber der hier angegebene funktioniert. (Kein Problem mit$0
, könnte aber in anderen Anwendungen sein.)$0
, könnte aber in anderen Anwendungen sein.)unset
ist wichtig, wenn Ihr Benutzer möglicherweiseCDPATH
eingestellt hat.readlink -f
oderrealpath
funktioniert dies unter Nicht-Linux-Versionen von Unix (z. B. Mac OS X).quelle
Wenn Sie die Shell-Parametererweiterung lernen möchten, können Sie sie hier lesen , aber die Erweiterung ist nicht immer eine gute Wahl. In diesem Fall verfügt fast jedes Unix-ähnliche System über zwei gute Dienstprogramme:
Der erste extrahiert den Dateinamen, während der zweite den Pfad extrahiert. Wenn Sie also $ 0 haben, sagen Sie:
Und du wirst den Weg bekommen.
Prost
quelle
Wir stellen vor: pwd, die eingebaute Bash. Auch im GNU Coreutils-Paket enthalten.
quelle