Mit bash>=3 Folgendes funktioniert:
$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s
$ cat s
#!/bin/bash
printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"
# ------------- SCRIPT ------------- #
#!/bin/bash
echo
echo "# arguments called with ----> ${@} "
echo "# \$1 ----------------------> $1 "
echo "# \$2 ----------------------> $2 "
echo "# path to me ---------------> ${0} "
echo "# parent path --------------> ${0%/*} "
echo "# my name ------------------> ${0##*/} "
echo
exit
# ------------- CALLED ------------- #
# Notice on the next line, the first argument is called within double,
# and single quotes, since it contains two words
$ /misc/shell_scripts/check_root/show_parms.sh "'hello there'" "'william'"
# ------------- RESULTS ------------- #
# arguments called with ---> 'hello there' 'william'
# $1 ----------------------> 'hello there'
# $2 ----------------------> 'william'
# path to me --------------> /misc/shell_scripts/check_root/show_parms.sh
# parent path -------------> /misc/shell_scripts/check_root
# my name -----------------> show_parms.sh
# ------------- END ------------- #
$BASH_SOURCE
gibt bei der Beschaffung des Skripts die richtige Antwort.
Dies beinhaltet jedoch den Pfad, um also nur den Dateinamen des Skripts zu erhalten, verwenden Sie:
$(basename $BASH_SOURCE)
me=`basename "$0"`
Um einen Symlink zu lesen, was normalerweise nicht das ist, was Sie wollen (Sie wollen den Benutzer normalerweise nicht auf diese Weise verwirren), versuchen Sie:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
IMO, das führt zu verwirrenden Ausgaben. "Ich habe foo.sh ausgeführt, aber es sagt, dass ich bar.sh ausführe!? Muss ein Fehler sein!" Außerdem besteht einer der Zwecke von Symlinks mit unterschiedlichen Namen darin, unterschiedliche Funktionen basierend auf dem Namen bereitzustellen, unter dem sie aufgerufen werden (denken Sie an gzip und gunzip auf einigen Plattformen).
Das heißt, Symlinks aufzulösen, wenn der Benutzer foo.sh
ausführt was eigentlich ein symbolischer Link zu bar.sh
ist , möchten Sie den aufgelösten Namen bar.sh
verwenden statt foo.sh
.