Hier ist eine portable Shell-Funktion, die in ANY Bourne vergleichbare Shell. Sie löst die relative Pfadinterpunktion ".. oder ." auf und dereferenziert symbolische Links.
Wenn Sie aus irgendeinem Grund keinen realpath(1)-Befehl oder readlink(1)-Befehl haben, kann dies als Alias verwendet werden.
which realpath || alias realpath='real_path'
Viel Spaß!
real_path () {
OIFS=$IFS
IFS='/'
for I in $1
do
# Resolve relative path punctuation.
if [ "$I" = "." ] || [ -z "$I" ]
then continue
elif [ "$I" = ".." ]
then FOO="${FOO%%/${FOO##*/}}"
continue
else FOO="${FOO}/${I}"
fi
## Resolve symbolic links
if [ -h "$FOO" ]
then
IFS=$OIFS
set `ls -l "$FOO"`
while shift ;
do
if [ "$1" = "->" ]
then FOO=$2
shift $#
break
fi
done
IFS='/'
fi
done
IFS=$OIFS
echo "$FOO"
}
Außerdem, nur für den Fall, dass es jemanden interessiert, hier ist, wie man basename und dirname in 100% reinem Shell-Code implementiert:
## http://www.opengroup.org/onlinepubs/000095399/functions/dirname.html
# the dir name excludes the least portion behind the last slash.
dir_name () {
echo "${1%/*}"
}
## http://www.opengroup.org/onlinepubs/000095399/functions/basename.html
# the base name excludes the greatest portion in front of the last slash.
base_name () {
echo "${1##*/}"
}
Sie können eine aktualisierte Version dieses Shell-Codes auf meiner Google-Seite finden: http://sites.google.com/site/jdisnard/realpath
EDIT: Dieser Code steht unter den Bedingungen der 2-Klausel-Lizenz (im Stil von freeBSD). Eine Kopie der Lizenz finden Sie, wenn Sie dem obigen Hyperlink zu meiner Website folgen.
1 Stimmen
Etwas spät, aber in Ihrer Frage fehlt ein Hinweis auf die von Ihnen verwendete Shell. Dies ist wichtig, denn
readlink
kann ein eingebauter oder ein externer Befehl sein.1 Stimmen
Das würde vielleicht den Unterschied erklären. Ich bin mir aber ziemlich sicher, dass ich bei beiden Gelegenheiten die Bash verwendet habe.
3 Stimmen
Warum ist diese Option auf Macs verboten?
0 Stimmen
@CommaToast - wenn ich mich recht erinnere, versuchen die Macs beim "Unix"-Teil des Betriebssystems, sich an POSIX- und/oder BSD-abgeleitete Tools und Dienstprogramme zu halten. Sie können GNU-Dienstprogramme auf OS/X installieren oder die Befehle so anpassen, dass sie eine "reine" Bourne-Shell verwenden (
/bin/sh
ohnebash
Erweiterungen). Für viele Entwickler sind heutzutage Shell-Skripte = Linux, GNU-Utilities undbash
so dass Probleme der Übertragbarkeit auftreten.5 Stimmen
Ich wünschte wirklich, Apple würde OS X dazu bringen, mehr Standard-Linux-Pfade zu unterstützen und sich um solche Dinge zu kümmern. Sie könnten es tun, ohne irgendetwas kaputt zu machen, oder?
1 Stimmen
@CommaToast Nun, sie werden mit Perl ausgeliefert, also ++ :-) ... öffnen Sie Terminal.app und geben Sie ein:
touch myfile ; ln -s myfile otherfile ; perl -MCwd=abs_path -le 'print abs_path readlink(shift);' otherfile
... in meinem Fall sehe ich: /Users/cito/myfile`. Ich habe es zu meiner Antwort unten hinzugefügt. Zum Wohl.1 Stimmen
@CommaToast GNU ist nicht Unix :-) Es wurde etwas hinzugefügt. Sie können eine Lösung mit
pwd -P
unter OS X, ohne etwas zu installieren1 Stimmen
@CommaToast
readlink
ist GPLv3 und Apple wird nichts anrühren, was unter der GPLv3 steht, da es erforderlich ist, einem Gerät kryptografische Schlüssel zu übergeben, um GPLv3-Software auf diesem Gerät zu ändern. gnu.org/licenses/ Das wird ein Grund dafür sein, dass die Standard-Shell nicht mehr Bash, sondern Zsh ist1 Stimmen
@JasonS aber FreeBSD hatte
readlink -f
seit irgendwann zwischen 2010 und 2012 abhängig vom Datum der Manpage und dem Datum der BSD-Veröffentlichung, und das ist keine GPL-Implementierung. Apple zögert also nur. Und tatsächlich,readlink -f
hat seinen Ursprung in OpenBSD 2.1 im Jahr 1997, soweit ich das beurteilen kann. Die erste Implementierung war also nicht einmal GNU. Ich kann verstehen, dass es nicht in Snow Leopard ist, aber ich kann nicht verstehen, dass es nicht in Mavericks/Sierra ist.0 Stimmen
@WyattWard Gutes Argument. Der einzige Mac, zu dem ich Zugang habe (10.11 Big Sur), hat das Datum des Readlinks von 2003. Also ja, es könnte aktualisiert werden. Und wie du sagst, nicht GPLv3 überhaupt, so ignorieren Sie meine früheren Kommentar über es GPLv3. Ich war ein bisschen blind, weil sich so viele Leute darüber beschwert haben, dass Mac OS nicht GNU ist. Nein, ist es nicht. Wird es auch nie sein. Aber der Punkt bleibt, dass man die Arbeit trotzdem erledigen kann mit
pwd -P
ohne zu wünschen, dass Mac OS ein GNU Linux ist, indem man Homebrew benutzt. Ja, Shell-Skripte sind nicht portabel. Das gilt nicht nur für Mac OS.4 Stimmen
MacOS 12.3 unterstützt
readlink -f
.