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 diffthrough colordiffe less -Rutilizzo:
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 whiche 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/fossiluna stringa diversa dafossil, quindi, quando dici/usr/bin/fossil, non tenta di eseguire lafossilfunzione.