Linux / Comando type: identificar como o Bash resolve comandos

type é um comando interno do Bash que identifica como o shell interpreta um nome: alias, palavra reservada, função, comando interno ou arquivo executável. Use type -a nome quando houver candidatos com o mesmo nome e type -t nome para obter somente a categoria. Isso ajuda a explicar por que um comando executa algo diferente do esperado.

Shell é o interpretador de comandos. No Bash, type consulta o ambiente do próprio shell, incluindo seus aliases e funções; um utilitário externo como which pode ter outro comportamento. Para conhecer outros comandos, consulte a referência de comandos Linux em português.

O que é o comando type?

O Bash expande aliases durante a leitura de comandos, quando essa opção está ativa. Na execução de um nome simples sem barra, procura funções, comandos internos e, depois, arquivos executáveis. PATH é a lista de diretórios pesquisados, separados por dois-pontos. A regra de busca e execução do Bash explica também o cache de caminhos.

type pertence ao próprio Bash; não é necessário instalar um programa separado. Execute os exemplos no Bash, pois Zsh, Dash e outros shells podem oferecer opções diferentes. Você pode consultar a ajuda local com help type, seguindo o guia do comando help.

Sintaxe básica e tipos de resultado

type [-afptP] nome [nome ...]

O bloco anterior é um esquema: colchetes indicam opções ou nomes adicionais, e não devem ser digitados literalmente. Informe pelo menos um nome. Os comandos abaixo consultam a resolução desses nomes sem executá-los.

type ls
type cd
type if
type printf

A saída padrão traz uma descrição. Em um Bash sem personalizações, cd e printf normalmente aparecem como comandos internos, if como palavra reservada e ls como arquivo externo. Aliases e funções podem alterar o resultado; o texto descritivo também varia com o idioma.

Tipo Significado
alias Abreviação expandida para outro texto quando o shell lê uma posição de comando e a expansão está ativa.
keyword Palavras reservadas do shell, como if e for.
function Funções definidas no shell atual.
builtin Comandos internos incluídos no próprio Bash.
file Arquivos executáveis externos encontrados através da pesquisa PATH.

Consultar todos os candidatos com o mesmo nome

-a lista os candidatos com esse nome: aliases ativos, palavras reservadas, funções, comandos internos e arquivos encontrados nos diretórios de PATH. Essa consulta ajuda a localizar alternativas ocultas pela primeira correspondência.

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

printf pode existir como comando interno e como executável externo. type printf descreve o primeiro resultado; type -a printf pode mostrar ambos. A presença e os caminhos dos arquivos dependem da instalação.

Opções para selecionar o formato de saída

Mostrar apenas a categoria com -t

-t imprime uma das categorias alias, keyword, function, builtin ou file. Em um Bash comum, os dois primeiros exemplos abaixo produzem builtin e keyword. Um nome desconhecido não gera categoria e causa estado de saída diferente de zero.

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

Consultar caminhos com -p e -P

-p mostra um caminho quando a resolução normal é um arquivo externo. Se o primeiro resultado for alias, função ou comando interno, não imprime um caminho. Assim, type -p cd normalmente fica sem saída, mesmo que cd exista como comando interno; ausência de texto, sozinha, não comprova que o nome seja desconhecido.

type -p ls
type -p cd

-P procura um arquivo executável mesmo quando o nome também é alias, função ou comando interno. Isso permite encontrar a versão externa de printf ou test, se instalada; a opção apenas consulta e não muda a prioridade de execução de comandos posteriores.

type -P printf
type -P test

O hash é o cache de caminhos de executáveis. Quando há uma entrada armazenada, -p e -P podem mostrá-la em vez do primeiro arquivo de PATH. hash -r limpa esse cache no shell atual, sem remover arquivos. Para pesquisar todos os arquivos de PATH sem consultar o hash, use type -a -p nome.

Resumo das opções de type

Opção Descrição
-a Imprime todos os candidatos que correspondem ao nome.
-f Ignora a busca por funções; também funciona sem -a.
-p Imprime o caminho quando o resultado da interpretação padrão é um executável externo.
-P Consulta um arquivo externo mesmo que outro tipo tenha prioridade; não altera a execução futura.
-t Mostra a categoria do comando em uma palavra.

Quando aliases e funções mudam o comando

Consultar aliases

Em um shell interativo, aliases podem incluir opções frequentes. type ls mostra como o nome é interpretado; alias ls consulta a definição do alias. Se ele não estiver definido, essa segunda consulta pode retornar erro, o que é esperado.

type ls
alias ls

Nos exemplos abaixo, \ls evita a expansão do alias ls, mas ainda pode encontrar uma função com esse nome. Um caminho absoluto ignora a busca por nome no shell; confirme primeiro com type -P ls se /usr/bin/ls é o caminho correto no seu sistema. Diferentemente de type, as duas linhas abaixo executam o nome ou caminho indicado. Quando chegam ao ls externo padrão, listam o diretório atual.

\ls
/usr/bin/ls

Consultar definições de funções

Uma função pode ocultar um comando interno ou um executável de mesmo nome. deploy abaixo é apenas um nome de exemplo: substitua-o por uma função existente no seu shell. type deploy pode exibir sua definição e type -t deploy retorna function; se o nome não existir, as consultas falham sem executar implantação alguma.

type deploy
type -t deploy

Dentro de uma função, command nome ignora a busca por funções de mesmo nome, ajudando a evitar recursão. Isso ainda permite comandos internos; não significa “sempre executar um arquivo externo”. Por exemplo, command printf normalmente usa o comando interno do Bash. Para consultar sem executar, use command -v nome.

Comparar type, command -v e which

Método Recursos
type nome Explica aliases, palavras reservadas, funções, comandos internos e arquivos no Bash em detalhes.
type -a nome Verifica todos os candidatos possíveis com o mesmo nome.
command -v nome Relativamente portátil para verificar a existência e a resolução de comandos em scripts shell.
which nome Dependendo da implementação, encontra principalmente arquivos executáveis em PATH e pode não refletir com precisão funções shell ou aliases.

type oferece detalhes úteis no Bash. Em scripts para shells POSIX, command -v nome é uma opção portátil para consultar se o nome é reconhecido; a saída não precisa ser um caminho, pois funções e comandos internos também podem ser encontrados. Uma consulta bem-sucedida não comprova que o comando aceitará argumentos específicos nem que terá permissão para realizar a tarefa.

Usar type em scripts Bash

Classificar um nome de comando

Salve o exemplo completo como classificar-comando.sh e execute bash classificar-comando.sh cd. Ele requer Bash e um único nome; a saída esperada nesse caso é cd: builtin. O separador -- impede que o nome recebido seja interpretado como opção de type.

#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
  printf '%s\n' 'Uso: bash classificar-comando.sh nome' >&2
  exit 1
fi

kind=$(type -t -- "$1") || {
  printf 'Comando não encontrado: %s\n' "$1" >&2
  exit 1
}

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

Experimente também bash classificar-comando.sh if, cuja saída esperada é if: keyword. Um nome inexistente produz diagnóstico e estado 1; consulte echo "$?" logo após executar o script. Sem argumento, ele mostra a instrução de uso. Cada execução consulta o novo processo Bash: aliases e funções apenas locais ao shell pai não são transferidos automaticamente, e aliases ficam desativados por padrão em scripts.

Usar o estado de saída

Evite analisar frases descritivas, que variam com versão e idioma. O trecho seguinte imprime uma mensagem se git for reconhecido no ambiente atual; não executa o Git nem testa acesso a repositórios. Para vários nomes, type retorna sucesso apenas se todos forem encontrados. Um bloco if sem else também não deve ser usado sozinho como o estado final de um teste de ausência.

if type git >/dev/null 2>&1; then
 printf '%s\n' 'git é reconhecido pelo shell.'
fi

Perguntas frequentes

Por que type -p não imprime nada?

Alias, função ou comando interno podem ter prioridade, embora o nome exista. Veja todos os candidatos com type -a nome e procure o arquivo externo com type -P nome. Se precisar somente da categoria, use type -t nome.

Por que ainda aparece um caminho antigo?

Inspecione o hash com hash e limpe-o com hash -r para repetir a consulta. No Bash, atribuir um novo valor a PATH já limpa o hash; não atribua automaticamente esse sintoma a um cache antigo após uma atribuição. Verifique também aliases, funções e se a alteração ocorreu no mesmo processo de shell. O exemplo abaixo consulta ls; substitua esse nome pelo desejado.

hash
hash -r
type -P ls

Por que um alias do terminal não aparece no script?

Um script normalmente inicia outro processo e não herda os aliases locais do terminal. Além disso, a expansão de aliases fica desativada por padrão no Bash não interativo, salvo configuração de expand_aliases. Na automação, prefira funções definidas no próprio script ou comandos explícitos; consulte as regras de aliases do Bash.

type só encontra a localização de executáveis?

Não. Ele mostra como o Bash interpreta o nome atualmente e distingue aliases, palavras reservadas, funções e comandos internos.

A ordem de type -a corresponde à execução?

Ela ajuda a entender os candidatos, mas não substitui a análise do contexto. Aliases dependem da expansão, palavras reservadas dependem da sintaxe e a execução de arquivos também considera o hash. Compare a consulta normal com type -a nome e, para arquivos sem o hash, type -a -p nome.

As opções são iguais em outros shells?

Não necessariamente. As opções deste artigo são do Bash. Consulte a documentação do shell realmente usado, como Zsh ou Dash, antes de reutilizá-las.

Resumo

type é uma ferramenta que distingue entre aliases, funções, comandos internos e arquivos executáveis com o mesmo nome e diagnostica a resolução real do comando. Com a saída padrão, você pode ler explicações, usar -a para encontrar todos os candidatos, -t para obter apenas o tipo, e -P para consultar arquivos executáveis externos mesmo quando outro tipo tem prioridade.

Quando um comando se comporta de forma inesperada, comece por type -a nome. Compare a categoria, a definição e os caminhos antes de alterar aliases, funções ou PATH; assim você pode escolher qual comportamento precisa corrigir.

Documentação oficial