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 diff
through colordiff
et less -R
j'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 which
et à 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/fossil
une chaîne différente defossil
, donc, quand vous dites/usr/bin/fossil
, il n'essaie pas d'exécuter lafossil
fonction.