Linux / Comando / type: identificar qué ejecutará Bash

type es un comando incorporado que muestra cómo Bash interpreta el nombre de un comando ingresado: si como alias, palabra reservada, función, comando incorporado o archivo ejecutable. Es útil para encontrar la causa cuando existen varias formas con el mismo nombre o cuando se ejecuta un programa diferente al esperado.

Si which se centra principalmente en encontrar archivos ejecutables en PATH, type explica la interpretación real del comando, incluyendo los alias y funciones actuales del shell. Es un comando que se recomienda usar primero al diagnosticar el entorno de Bash.

¿Qué es el comando type?

El shell busca los nombres de comandos siguiendo ciertas reglas antes de ejecutar un comando: alias, funciones, comandos incorporados y archivos ejecutables de PATH. type indica qué tipo considera Bash que es ese nombre y qué ejecutará.

El propio type también es un comando incorporado de Bash. Otros shells tienen comandos similares, pero las opciones y el formato de salida pueden variar, por lo que los ejemplos de este artículo se basan en Bash.

Sintaxis básica y tipos de resultados

type [-afptP] [NOMBRE...]

Se puede especificar uno o más nombres de comando.

type ls
type cd
type if
type printf

La salida básica es una frase legible para humanos. Según la configuración del entorno, pueden aparecer los siguientes tipos.

Tipo Significado
alias Es un alias de shell que se expande a otra cadena antes de la entrada.
keyword Es una palabra reservada del shell como if, for.
function Son funciones definidas en el shell actualmente.
builtin Es un comando incorporado incluido en Bash.
file Archivo ejecutable externo encontrado mediante la búsqueda PATH.

Verificar todos los candidatos con el mismo nombre

-a muestra todas las ubicaciones que coinciden con el nombre, incluyendo alias, funciones, comandos incorporados y archivos ejecutables encontrados en PATH.

type -a printf
type -a test
type -a ls

printf puede coexistir con comandos incorporados de Bash y archivos ejecutables externos. El type printf predeterminado muestra solo los elementos que se seleccionarán primero, pero -a es útil cuando se investigan candidatos que quedan ocultos detrás.

Opción para seleccionar el formato de salida

Solo imprimir el tipo -t

-t imprime uno de alias, keyword, function, builtin, file en lugar de la frase descriptiva. Si no se encuentra el nombre, no imprime nada y devuelve un estado de error.

type -t cd
type -t if
type -t ls

Imprimir la ruta del archivo ejecutable -p y -P

-p imprime la ruta del archivo ejecutable cuando ese nombre se interpreta como un archivo externo. Si un alias, función o comando incorporado se selecciona primero, puede que no se imprima.

type -p ls
type -p cd

-P fuerza la búsqueda de PATH para encontrar un candidato a archivo ejecutable incluso si el nombre actual es un alias o comando incorporado.

type -P printf
type -P test

Si Bash tiene rutas en caché, -p y -P pueden mostrar una ruta almacenada diferente al primer elemento actual de PATH. Si tiene dudas, vacíe la caché con hash -r y vuelva a comprobar.

Resumen de opciones de type

Opciones Descripción
-a Imprime todos los candidatos que coincidan con el nombre.
-f Omite la búsqueda de funciones. Es posible que su efecto sea limitado si no se utiliza junto con -a.
-p Cuando el resultado de la interpretación básica es un archivo ejecutable externo, imprime la ruta.
-P Fuerza la búsqueda de un ejecutable externo en PATH.
-t Imprime el tipo de comando en una sola palabra.

Cuando el comando cambia debido a alias o funciones

Comprobar alias

En un shell interactivo, las opciones que se usan con frecuencia pueden incluirse en un alias.

type ls
alias ls

La barra invertida en \ls impide la expansión del alias, pero no evita una función llamada ls. Una ruta absoluta selecciona ese archivo concreto si existe; compruebe su ubicación en lugar de asumir que siempre está en /usr/bin.

\ls
/usr/bin/ls

Comprobar la definición de funciones

Si se define una función de shell con el mismo nombre que un comando externo, la función puede ejecutarse primero. La salida predeterminada de type puede mostrar la definición de la función.

type deploy
type -t deploy

Dentro de una función, command NOMBRE omite la búsqueda de funciones, pero todavía puede seleccionar un comando interno. Para exigir un ejecutable externo, identifique su ruta y ejecútela explícitamente.

type, command -v, comparación con which

Método Características
type NOMBRE En Bash, explica detalladamente alias, palabras reservadas, funciones, comandos internos y archivos.
type -a NOMBRE Verifique todos los candidatos que se pueden encontrar con el mismo nombre.
command -v NOMBRE Es relativamente portátil para verificar la existencia de comandos y los resultados de interpretación en scripts de shell.
which NOMBRE Dependiendo de la implementación, generalmente se busca el archivo ejecutable de PATH, y es posible que no se reflejen con precisión las funciones del shell o los alias.

Al realizar un diagnóstico interactivo en Bash, type es generalmente adecuado, mientras que para comprobar la existencia de un comando en scripts de shell POSIX, command -v suele ser apropiado.

Uso seguro en scripts de shell

Diferenciar según el tipo de comando

kind=$(type -t "$1") || {
  printf 'No se encontró el comando: %s\n' "$1" >&2
  exit 1
}

case $kind in
  alias|function|builtin|file|keyword)
    printf '%s: %s\n' "$1" "$kind"
    ;;
esac

Guarde el bloque en identify-command.sh y ejecútelo con Bash y un argumento, por ejemplo bash identify-command.sh printf. Debe mostrar printf: builtin en un Bash normal. Un nombre inexistente imprime el error en la salida estándar de errores y termina con estado 1. Un script nuevo no hereda automáticamente los alias y funciones de una sesión interactiva.

Usar el estado de salida en lugar de la salida de texto

La salida predeterminada puede variar según la versión o la configuración regional. Para simplemente comprobar la existencia de un comando, no analice la cadena de resultado, sino verifique el estado de salida.

if type git >/dev/null 2>&1; then
  printf '%s\n' 'git está disponible.'
fi

Preguntas frecuentes

type -p no produce ninguna salida

Ese nombre puede interpretarse primero como un alias, una función o un comando incorporado, o puede que no exista un archivo ejecutable externo. Use type -a NOMBRE para ver todos los candidatos, y si desea buscar únicamente archivos externos, use type -P NOMBRE.

He cambiado PATH pero sigue apareciendo la ruta anterior

Es posible que la ruta de ejecución anterior permanezca en la tabla hash de Bash. Verifique el hash actual y, si es necesario, vacíelo antes de buscar de nuevo.

hash
hash -r
type -P COMANDO

Los alias no son visibles en los scripts

En Bash no interactivo, la expansión de alias no está activada de manera predeterminada. Los resultados de la interpretación de comandos pueden diferir entre el shell interactivo y los scripts, por lo que no se recomienda depender de alias en la automatización.

type ¿es un comando que solo busca la ubicación de los archivos ejecutables?

No. Muestra cómo Bash interpreta actualmente un nombre, y también distingue entre alias, palabras reservadas, funciones y comandos incorporados.

¿El orden de salida de type -a indica la prioridad de ejecución?

El primer elemento generalmente ayuda a comprender el objetivo que se selecciona actualmente en la shell. Sin embargo, el hash, las opciones de la shell y el contexto de ejecución pueden influir, por lo que para tareas importantes, verifique también el entorno real.

¿Las opciones son las mismas en otras shells?

No necesariamente. Las opciones de este artículo se basan en Bash. En Zsh, Dash, etc., consulte la ayuda de la shell correspondiente.

Cuando un comando se comporta de manera diferente a lo esperado, intente ejecutarlo primero con type -a NOMBRE. Otros comandos básicos se pueden consultar en Lista y resumen de comandos de Linux.

Las reglas de búsqueda se documentan en la Documentación oficial de comandos incorporados de GNU Bash y en el Manual oficial de GNU Bash.