Parfois, je définis une fonction qui associe un exécutable et ajuste ses arguments ou sa sortie. Donc, la fonction a le même nom que l'exécutable, et j'ai besoin d'un moyen pour exécuter l'exécutable à partir de la fonction sans appeler la fonction de manière récursive. Par exemple, pour exécuter automatiquement la sortie de fossil diffthrough colordiffet less -Rj'utilise:
function fossil () {
local EX=$(which fossil)
if [ -z "$EX" ] ; then
echo "Unable to find 'fossil' executable." >&2
return 1
fi
if [ -t 1 ] && [ "$1" == "diff" ] ; then
"$EX" "$@" | colordiff | less -R
return
fi
"$EX" "$@"
}
Si j'étais sûr de l'emplacement de l'exécutable, je pourrais simplement taper /usr/bin/fossil. Bash reconnaît que cela /signifie que la commande est un exécutable, pas une fonction. Mais comme je ne connais pas l'emplacement exact, je dois recourir à l'appel whichet à la vérification du résultat. Existe-t-il un moyen plus simple?
/signifie que la commande est un exécutable, pas une fonction.» À strictement parler, ce n'est pas vrai. Dans ce que je pense être une décision de conception horrible (et non documentée), bash permet aux noms de fonctions de contenir des barres obliques. Les barres obliques provoquent simplement/usr/bin/fossilune chaîne différente defossil, donc, quand vous dites/usr/bin/fossil, il n'essaie pas d'exécuter lafossilfonction.