De suas outras perguntas eu entendo que você está usando o OS X. O sistema de arquivos padrão HFS + 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 tentar acessar qualquer um dos nomes chegará ao mesmo arquivo. A mesma coisa pode acontecer com o Cygwin, ou com sistemas de arquivos que não diferenciam maiúsculas de minúsculas (como FAT32 ou ciopfs ) em qualquer lugar.
Como grep
é um executável real, ele é consultado no sistema de arquivos (nos diretórios de PATH
). Quando seu shell procurar /usr/bin
para grep
ou GREP
, ele encontrará o executável grep
.
Os integrantes do shell não são pesquisados no sistema de arquivos: como são integrados, eles são acessados por meio de comparações de caracteres (com distinção entre maiúsculas e minúsculas) dentro do próprio shell.
O que você está encontrando é um caso interessante. Embora cd
seja um arquivo interno, acessado com distinção entre maiúsculas e minúsculas, CD
é encontrado como um executável /usr/bin/cd
. O executável cd
é bastante inútil: porque cd
afeta o ambiente atual de execução do shell, é sempre fornecido como um shell interno , mas há um executável cd
para o bem de POSIX , que muda o diretório para si mesmo e, em seguida, termina imediatamente, deixando o shell em torno de onde ele começou.
Você pode testá-los com o type
builtin :
$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD
type
informa o que o shell fará quando você executar esse comando. Quando você executa cd
, acessa o builtin, mas CD
encontra o executável. Para outras builtins, o builtin e o executável serão razoavelmente compatíveis (tente echo
), mas para cd
isso não é possível.