1. Das Schönste
Ich habe fast alle Vorschläge ausprobiert, und hier ist der beste, der bei mir funktioniert hat:
script_root=$(dirname $(readlink -f $0))
Es funktioniert auch, wenn das Skript mit einem Symlink zu einem $PATH
Verzeichnis.
Sehen Sie es hier in Aktion: https://github.com/pendashteh/hcagent/blob/master/bin/hcagent
2. Das Coolste
# Copyright https://stackoverflow.com/a/13222994/257479
script_root=$(ls -l /proc/$$/fd | grep "255 ->" | sed -e 's/^.\+-> //')
Das stammt eigentlich aus einer anderen Antwort auf dieser Seite, aber ich füge es auch meiner Antwort hinzu!
3. Die zuverlässigste
Für den seltenen Fall, dass diese Methoden nicht funktionieren, gibt es eine andere, absolut sichere Methode:
# Copyright http://stackoverflow.com/a/7400673/257479
myreadlink() { [ ! -h "$1" ] && echo "$1" || (local link="$(expr "$(command ls -ld -- "$1")" : '.*-> \(.*\)$')"; cd $(dirname $1); myreadlink "$link" | sed "s|^\([^/].*\)\$|$(dirname $1)/\1|"); }
whereis() { echo $1 | sed "s|^\([^/].*/.*\)|$(pwd)/\1|;s|^\([^/]*\)$|$(which -- $1)|;s|^$|$1|"; }
whereis_realpath() { local SCRIPT_PATH=$(whereis $1); myreadlink ${SCRIPT_PATH} | sed "s|^\([^/].*\)\$|$(dirname ${SCRIPT_PATH})/\1|"; }
script_root=$(dirname $(whereis_realpath "$0"))
Sie können es in Aktion sehen in taskrunner
Quelle: https://github.com/pendashteh/taskrunner/blob/master/bin/taskrunner
Hoffentlich hilft das jemandem da draußen :)
Hinterlassen Sie bitte auch einen Kommentar, wenn es bei Ihnen nicht funktioniert hat, und nennen Sie Ihr Betriebssystem und Ihren Emulator. Danke!