Às vezes, defino uma função que oculta um executável e ajusta seus argumentos ou saída. Portanto, a função tem o mesmo nome que o executável, e eu preciso de uma maneira de executar o executável a partir da função sem chamar a função recursivamente. Por exemplo, para executar automaticamente a saída de fossil diff
through colordiff
e less -R
eu uso:
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 eu tivesse certeza da localização do executável, eu poderia simplesmente digitar /usr/bin/fossil
. Bash reconhece que isso /
significa que o comando é um executável, não uma função. Mas como não sei a localização exata, tenho que recorrer à chamada which
e verificação do resultado. Existe uma maneira mais simples?
/
significa que o comando é um executável, não uma função". Estritamente falando, isso não é verdade. No que eu acredito ser uma decisão de design horrível (e não documentada), o bash permite que os nomes de funções contenham barras. As barras simplesmente fazem/usr/bin/fossil
com que seja uma sequência diferente defossil
, portanto, quando você diz/usr/bin/fossil
, não tenta executar afossil
função.