Depende.
Os comandos podem cair em várias categorias: builtins, aliases, funções, executáveis (scripts e binários no caminho de pesquisa).
Na linha de comando, estes ocupam um único namespace simples que torna impossível a substituição. Existem inúmeras maneiras de dizer tipos de programas à parte:
$ f () { :; }
$ alias a=cat
$ which f
f ()
{
:
}
Sabemos que f
é uma função.
$ which a
alias a='cat'
/usr/bin/cat
Sabemos que a
é um alias.
$ which yes
/usr/bin/yes
Sabemos que yes
é um programa.
$ builtin echo ; echo $?
0
O shell tem um echo
construído…
$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1
… mas nenhum para cat
. Se houver um builtin ou um alias
mas você insiste em chamar o programa, prefixar o
comando com uma barra invertida:
$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0