Das suas outras perguntas, suponho que você esteja usando o OS X. O sistema de arquivos HFS + padrão no OS X não diferencia maiúsculas de minúsculas: você não pode ter dois arquivos chamados "abc" e "ABC" no mesmo diretório e tentando acessar qualquer nome chegará ao mesmo arquivo. O mesmo pode acontecer no Cygwin ou em sistemas de arquivos que não diferenciam maiúsculas de minúsculas (como FAT32 ou ciopfs ) em qualquer lugar.
Por grepser um executável real, ele foi procurado no sistema de arquivos (nos diretórios de PATH). Quando o seu shell procurar /usr/binpor um grepou GREPencontrará o grepexecutável.
Os componentes internos do shell não são pesquisados no sistema de arquivos: como são integrados, eles são acessados através de comparações de strings (com distinção entre maiúsculas e minúsculas) dentro do próprio shell.
O que você está encontrando é um caso interessante. Enquanto cdé um builtin, acessado com distinção entre maiúsculas e minúsculas, CDé encontrado como um executável /usr/bin/cd. O cdexecutável é bastante inútil: porque cdafeta o ambiente atual de execução do shell, ele sempre é fornecido como um shell regular , mas existe um cdexecutável para o bem do POSIX , que altera o diretório por si mesmo e termina imediatamente, deixando o shell ao redor onde começou.
Você pode experimentá-los com o typebuiltin :
$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD
typeinforma o que o shell fará quando você executar esse comando. Quando você executa, cdvocê acessa o builtin, mas CDencontra o executável. Para outros buildins, o builtin e o executável serão razoavelmente compatíveis (try echo), mas, para cdisso, não é possível.
alias GREPouwhich GREPproduz alguma coisa.