A veces defino una función que sombrea un ejecutable y modifica sus argumentos o resultados. Entonces, la función tiene el mismo nombre que el ejecutable, y necesito una forma de ejecutar el ejecutable desde la función sin llamarla recursivamente. Por ejemplo, para ejecutar automáticamente la salida de fossil diff
through colordiff
y less -R
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" "$@"
}
Si estuviera seguro de la ubicación del ejecutable, simplemente podría escribir /usr/bin/fossil
. Bash reconoce que eso /
significa que el comando es un ejecutable, no una función. Pero como no conozco la ubicación exacta, tengo que recurrir a llamar which
y verificar el resultado. ¿Hay una manera más sencilla?
/
significa que el comando es un ejecutable, no una función". Estrictamente hablando, eso no es cierto. En lo que creo que es una decisión de diseño horrible (e indocumentada), bash permite que los nombres de funciones contengan barras diagonales. Las barras simplemente hacen/usr/bin/fossil
que sea una cadena diferente defossil
, por lo que, cuando dices/usr/bin/fossil
, no intenta ejecutar lafossil
función.