GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Woher weiß ich den Namen der Skriptdatei in einem Bash-Skript?

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 .


Linux
  1. Warum erkennt das Bash-Skript keine Aliase?

  2. Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner?

  3. Wie liest man das gesamte Shell-Skript, bevor man es ausführt?

  4. Wie kann man Bash-Skripte in Vim hervorheben?

  5. So ersetzen Sie Leerzeichen in Dateinamen mit einem Bash-Skript

35 Bash-Skriptbeispiele

So führen Sie ein Bash-Skript aus

Wie überprüfe ich den Namen der Joomla-Datenbank?

Wie erhalte ich das absolute Verzeichnis einer Datei in Bash?

Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner

Wie man in einem Bash-Skript nach Unicode sucht