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 diffthrough colordiffy less -Ruso:
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 whichy 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/fossilque sea una cadena diferente defossil, por lo que, cuando dices/usr/bin/fossil, no intenta ejecutar lafossilfunción.Respuestas:
Use el
commandcaparazón incorporado:fuente
\date.En los scripts, la
#!línea a menudo se usa/bin/env bashpara ejecutar el comando bash en función de la ruta. (Puede diferir para algunas utilidades). Esto debería funcionar aquí también ...(La
commandalternativa también debería funcionar, pero podría depender de un shell específico) (Funciona en Bourne Shell en Solaris, pero en realidad se ejecuta/bin/commanden ese caso, que es un shell incorporado en Bash)Ambos
/bin/commandy/bin/envse enumeran en SUS, por lo que todas las implementaciones compatibles deberían tenerlo.fuente
env. Tenía dudas sobre qué respuesta debería aceptar, pero como la pregunta es sobre bash , sucommandsolución integrada es la mejor.commandejecutable, perocommandtambién funciona endash,kshyzsh. Así que supongo que es un caparazón incorporado no solo enbash. pastebin.com/fi3gyNse/bin/envdespués del hash-bang si no quieren codificar la ruta del shell)La respuesta de Gert me hizo darme cuenta de que también se puede usar
nicecon el propósito (en realidad lo tuve en uno de mis scripts sin darme cuenta):Es menos elegante que las otras respuestas, pero en algunas circunstancias podría ser una opción útil.
fuente
`which date`.`which something`es que si no hay unsomethingejecutable, pueden pasar cosas desafortunadas. Por ejemplo, siechofalta, entonces`which echo` /bin/rm preciousFilehace algo muy diferente de lo previsto.