Ich schreibe ein Skript, das den kanonischen Pfad bestimmter Befehle benötigt. Da es symbolische Links geben könnte, die auf die eigentlichen Befehle verweisen, verwende ich , readlink -f
um den kanonischen Pfad zu erhalten. Aber ich bekomme mit nicht das, was ich eigentlich will. readlink -f
Ich erkläre es anhand des folgenden Beispiels:
Nehmen wir an, mein aktuelles Verzeichnis ist: Wenn ich versuche, einen Pfad davon /home/user/Documents
abzurufen, erhalte ich Folgendes:sleep
readlink -f
/home/user/Documents/sleep
Was ich eigentlich will, ist/bin/sleep
Antwort1
readlink -f "$(type -P sleep)"
oder wenn Sie leistungsbewusst sind:
cpath="$(type -P sleep)"; [ ! -L "$cpath" ] || cpath="$(readlink -f "$cpath")"
Die Verwendung von readlink -e
(existing) anstelle von readlink -f
kann Sie vor solchen Unfällen bewahren, bei denen Sie mit einer nicht vorhandenen Datei arbeiten.
Das zweite Beispiel geht davon aus, dass der zurückgegebene Pfad type -P
kanonisch ist. Dies bedeutet, dass Ihr Pfad keine nicht-kanonischen Komponenten aufweist.