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.Respuestas:
Use el
command
caparazón incorporado:fuente
\date
.En los scripts, la
#!
línea a menudo se usa/bin/env bash
para ejecutar el comando bash en función de la ruta. (Puede diferir para algunas utilidades). Esto debería funcionar aquí también ...(La
command
alternativa 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/command
en ese caso, que es un shell incorporado en Bash)Ambos
/bin/command
y/bin/env
se 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 , sucommand
solución integrada es la mejor.command
ejecutable, perocommand
también funciona endash
,ksh
yzsh
. Así que supongo que es un caparazón incorporado no solo enbash
. pastebin.com/fi3gyNse/bin/env
despué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
nice
con 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 unsomething
ejecutable, pueden pasar cosas desafortunadas. Por ejemplo, siecho
falta, entonces`which echo` /bin/rm preciousFile
hace algo muy diferente de lo previsto.