GNU/Linux >> Tutoriels Linux >  >> Linux

Comment connaître le nom du fichier de script dans un script Bash ?

Avec bash>=3 les travaux suivants :

$ ./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 donne la bonne réponse lors de la recherche du script.

Cela inclut cependant le chemin, donc pour obtenir uniquement le nom de fichier des scripts, utilisez :

$(basename $BASH_SOURCE) 

me=`basename "$0"`

Pour lire un lien symbolique, ce qui n'est généralement pas ce que vous voulez (vous ne voulez généralement pas confondre l'utilisateur de cette façon), essayez :

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

IMO, cela produira une sortie confuse. "J'ai exécuté foo.sh, mais ça dit que j'exécute bar.sh ! ? Ça doit être un bug !" En outre, l'un des objectifs d'avoir des liens symboliques portant des noms différents est de fournir des fonctionnalités différentes en fonction du nom auquel ils sont appelés (pensez à gzip et gunzip sur certaines plates-formes).

Autrement dit, pour résoudre les liens symboliques tels que lorsque l'utilisateur exécute foo.sh qui est en fait un lien symbolique vers bar.sh , vous souhaitez utiliser le nom résolu bar.sh plutôt que foo.sh .


Linux
  1. Pourquoi le script Bash ne reconnaît-il pas les alias ?

  2. Comment déboguer un script bash ?

  3. La fête ?

  4. Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

  5. Comment arrêter le script Loop Bash dans le terminal ?

35 exemples de scripts bash

Comment exécuter un script bash

Comment vérifier le nom de la base de données Joomla ?

Comment obtenir le répertoire absolu d'un fichier dans bash ?

Script bash pour supprimer le fichier le plus ancien d'un dossier

Comment grep pour unicode � dans un script bash