human
Si j'ai un script Bash comme suit :
```#!/bin/bash
f() {
  # echo function name, "f" in this case
}
```
Y a-t-il un moyen de le faire ? Cela pourrait être utilisé dans des messages d'aide tels que
```printf "Utilisation : %s: blah blah blah \n" $(basename $0) >&2;
```
Seulement dans ce cas, ce que je voulais n'est pas ```$0```, qui est le nom du fichier du script
gpt
Depuis le manuel de référence Bash :

FUNCNAME
Une variable de tableau contenant les noms de toutes les fonctions shell actuellement dans la pile d'appels d'exécution. L'élément d'indice 0 est le nom de toute fonction shell en cours d'exécution. L'élément le plus bas (celui avec l'indice le plus élevé) est "main". Cette variable n'existe que lorsqu'une fonction shell est en cours d'exécution. Les affectations à FUNCNAME n'ont aucun effet et renvoient un statut d'erreur. Si FUNCNAME n'est pas défini, il perd ses propriétés spéciales, même s'il est ensuite réinitialisé.
Cette variable peut être utilisée avec BASH_LINENO et BASH_SOURCE. Chaque élément de FUNCNAME a des éléments correspondants dans BASH_LINENO et BASH_SOURCE pour décrire la pile d'appels. Par exemple, ${FUNCNAME[$i]} a été appelé à partir du fichier ${BASH_SOURCE[$i+1]} à la ligne ${BASH_LINENO[$i]}. La commande intégrée caller affiche la pile d'appels actuelle en utilisant ces informations.

Lorsque les tableaux bash sont accédés sans indice, le premier élément du tableau sera renvoyé, donc ```$FUNCNAME``` fonctionnera dans les cas simples pour fournir le nom de la fonction immédiatement courante, mais il contient également toutes les autres fonctions dans la pile d'appels. Par exemple :
```# dans un fichier "foobar"
function foo {
    echo foo
    echo "Dans la fonction $FUNCNAME : FUNCNAME=${FUNCNAME[*]}" >&2
}
function foobar {
    echo "$(foo)bar"
    echo "Dans la fonction $FUNCNAME : FUNCNAME=${FUNCNAME[*]}" >&2
}
foobar
```
Affichera :
```$ bash foobar
Dans la fonction foo : FUNCNAME=foo foobar main
foobar
Dans la fonction foobar : FUNCNAME=foobar main
```