A volte definisco una funzione che ombreggia un eseguibile e ne modifica gli argomenti o l'output. Quindi la funzione ha lo stesso nome dell'eseguibile e ho bisogno di un modo per eseguire l'eseguibile dalla funzione senza chiamare ricorsivamente la funzione. Ad esempio, per eseguire automaticamente l'output di fossil diff
through colordiff
e less -R
utilizzo:
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" "$@"
}
Se fossi sicuro della posizione dell'eseguibile, potrei semplicemente digitare /usr/bin/fossil
. Bash riconosce che /
significa che il comando è un eseguibile, non una funzione. Ma poiché non conosco la posizione esatta, devo ricorrere alla chiamata which
e al controllo del risultato. c'è un modo più facile?
/
il comando è un eseguibile, non una funzione". A rigor di termini, non è vero. In quella che credo sia una decisione di design orribile (e non documentata), bash consente ai nomi delle funzioni di contenere barre. Le barre causano semplicemente/usr/bin/fossil
una stringa diversa dafossil
, quindi, quando dici/usr/bin/fossil
, non tenta di eseguire lafossil
funzione.