Die Variable $ 0 enthält die Pfadinformationen des Skripts.
- Wie kann ich die Pfadinformationen in absoluten Pfad ändern? Ich meine, wie man ~,., .. oder ähnliches verarbeitet?
- Wie kann ich die Pfadinformationen in Verzeichnis und Dateinamen aufteilen?
Ich könnte Python / Perl dafür verwenden, aber ich möchte wenn möglich Bash verwenden.
Antworten:
Sie müssen keine Dinge wie verarbeiten
~
, die Shell erledigt das für Sie. Aus diesem Grund können Sie~/filename
an jedes Skript oder Programm übergeben, und es funktioniert - all diese Programme behandeln~
sich nicht selbst, Ihre Shell konvertiert das Argument in/home/username/filename
und übergibt es stattdessen an das Programm:Wenn Sie einen kanonischen Dateinamen benötigen (der keine Dinge wie enthält
..
), verwenden Sierealpath
(danke Neil ):Verwenden Sie zum Aufteilen des Pfads in Verzeichnisname und Dateiname
dirname
undbasename
:quelle
realpath
ist besser,readlink
scheint aber zu funktionieren, wenn ich es versuche; Kennen Sie ein Beispiel, bei dem es fehlschlägt?cd /tmp; touch foo; ln -s foo bar; cd; readlink /tmp/bar
. Dies kehrt zurückfoo
undrealpath
kehrt zurück/tmp/foo
, was Sie wollen.readlink -f
(Anmerkung-f
) ist fast gleichbedeutend mitrealpath
und es ist portabler:readlink -f
in GNU-Coreutils und existiert auch auf einigen anderen Systemen;realpath
ist separat verpackt und darf nicht installiert werden (zB hängen nur 5 nicht so übliche Pakete in Ubuntu 10.04 oder Debian Lenny davon ab).Die Verwendung von Dirname und Basename, wie von Michael erwähnt, sollte der sicherste Weg sein, um das zu bekommen, was Sie wollen.
Wenn Sie dies wirklich mit "bash only tools" tun möchten, können Sie die Parametersubstitution verwenden:
Dieses Beispiel stammt direkt aus dem Advanced Bash Scripting Guide, das einen Blick wert ist.
Die Erklärung ist ziemlich einfach:
Betrachten Sie das Muster wie einen regulären Ausdruck und den
#
oder##
als eine Art gierigen / nicht gierigen Modifikator.Dies kann nützlich sein, wenn Sie einige kompliziertere Extraktionen eines Pfadteils durchführen müssen.
quelle
${...##...}
und Freunde verwendendirname
und nicht,basename
dass sie nicht in allen Fällen funktionieren. Zum Beispiel beides${0##*/}
und${0%/*}
erweitern auf dasselbe, als$0
ob$0
es kein a enthält/
.${0%/*}
ist keine gute Alternative zudirname
. Was ist jedoch falsch daran,${0##*/}
statt zu verwendenbasename
?$0
ein Verzeichnisname mit einem nachgestellten Zeichen angegeben wird/
. Aber ich bedauere meinen Rat, weildirname
es nicht besser geht.realpath
ist ein Befehl, der Ihnen den tatsächlichen Pfad angibt (entfernt .. und symbolische Links usw.)Es ist Standard bei FreeBSD. Nach dieser Diskussion ist es auch für Linux verfügbar:
http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html
Diese Diskussion bietet auch eine Bash-Lösung:
quelle