GNU/Linux >> Linux Esercitazione >  >> Linux

Come faccio a conoscere il nome del file di script in uno script Bash?

Con bash>=3 le seguenti opere:

$ ./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 fornisce la risposta corretta durante l'approvvigionamento dello script.

Ciò tuttavia include il percorso, quindi per ottenere solo il nome del file degli script, utilizzare:

$(basename $BASH_SOURCE) 

me=`basename "$0"`

Per leggere un collegamento simbolico, che di solito non è quello che vuoi (di solito non vuoi confondere l'utente in questo modo), prova:

me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

IMO, questo produrrà un output confuso. "Ho eseguito foo.sh, ma dice che sto utilizzando bar.sh!? Deve essere un bug!" Inoltre, uno degli scopi di avere collegamenti simbolici con nomi diversi è fornire funzionalità diverse in base al nome con cui viene chiamato (si pensi a gzip e gunzip su alcune piattaforme).

Cioè, per risolvere i collegamenti simbolici in modo tale che quando l'utente esegue foo.sh che in realtà è un collegamento simbolico a bar.sh , desideri utilizzare il nome risolto bar.sh anziché foo.sh .


Linux
  1. Perché lo script Bash non riconosce gli alias?

  2. Come eseguire il debug di uno script Bash?

  3. Il Bash '?

  4. Script Bash per rimuovere il file più vecchio da una cartella?

  5. Come fermare lo script Loop Bash nel terminale?

35 Esempi di script Bash

Come eseguire uno script Bash

Come leggere l'intero script della shell prima di eseguirlo?

Come creare uno script Bash per modificare il formato di una data in un file CSV?

Come controllare il nome del database Joomla?

Come grep per unicode � in uno script bash