readlink -f
wäre das Beste, wenn es tragbar war, weil es alle Links für beide Verzeichnisse und Dateien gefunden löst.
Auf Mac OS X gibt es keine readlink -f
(außer vielleicht über Macports), so dass Sie nur readlink
verwenden können, um das Ziel einer bestimmten symbolischen Linkdatei zu erhalten.
Die $(cd -P ... pwd -P)
Technik ist schön, aber funktioniert nur Links für Verzeichnisse, um das Skript, die zu lösen, es funktioniert nicht, wenn das Skript selbst ein Symlink ist
Auch ein Fall, der nicht erwähnt wurde: Wenn Sie Starten Sie ein Skript, indem Sie es als Argument an eine Shell übergeben (/bin/sh /path/to/myscript.sh
), $0
ist in diesem Fall nicht verwendbar
Ich habe einen Blick auf mysql "Binärdateien", viele von ihnen sind eigentlich Shell-Skripte; und jetzt verstehe ich, warum sie nach einer --basedir
Option fragen oder aus einem bestimmten Arbeitsverzeichnis gestartet werden müssen; dies liegt daran, dass es keine gute Lösung ist die gezielte Skript
Große Antwort - Ich hatte gehofft, dies würde auch funktionieren, wenn Sie das Skript, d. /some/script.sh 'aber es tut es nicht. – synthesizerpatel
@synthesizerpatel: In ksh93 hast du '$ {.sh.file}', was auch für Quelldateien funktioniert. –
Wie von Gruik aufgezeigt, funktioniert dies nicht, wenn es eine symbolische Verbindung zum Shell-Skript selbst gibt. Wenn Sie den Befehl beispielsweise in/usr/bin verknüpfen, gibt __REAL_SCRIPTDIR/usr/bin zurück, was (höchstwahrscheinlich) nicht das ist, was Sie wollen. Sie brauchen anscheinend readlink für diese –