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.Réponses:
Utilisez le
command
shell intégré:la source
\date
.Dans les scripts, la
#!
ligne utilise souvent/bin/env bash
pour exécuter la commande bash en fonction du chemin. (Cela peut différer pour certains utilitaires). Cela devrait également fonctionner ici ...(L'
command
alternative devrait également fonctionner, mais pourrait dépendre d'un shell spécifique) (Cela fonctionne sur le Bourne Shell sur Solaris, mais il fonctionne/bin/command
en fait dans ce cas, qui est un shell intégré à Bash)Les deux
/bin/command
et/bin/env
sont répertoriés dans SUS, donc toutes les implémentations conformes devraient l'avoir.la source
env
. J'avais des doutes quant à la réponse à donner, mais comme la question concerne bash , sa fonction intégréecommand
est la meilleure solution.command
exécutable, maiscommand
fonctionne aussidash
,ksh
etzsh
. Je suppose donc que c'est un shell intégré non seulement dansbash
. pastebin.com/fi3gyNse/bin/env
après le hash-bang s'ils ne veulent pas coder en dur le chemin du shell)La réponse de Gert m'a fait réaliser que l'on peut aussi l'utiliser
nice
à cette fin (je l'avais en fait dans l'un de mes scripts sans le savoir):C'est moins élégant que les autres réponses, mais dans certaines circonstances, cela pourrait être une option utile.
la source
`which date`
.`which something`
est que s'il n'y a pas d'something
exécutable, des choses malheureuses peuvent se produire. Par exemple, siecho
est manquant,`which echo` /bin/rm preciousFile
fait quelque chose de très différent de celui prévu.