Por que os shell builtins não podem ser executados com letras maiúsculas, mas outros comandos podem?

33

Por que isso acontece?

Quando faço isso

CD ~/Desktop

Não me leva ao Desktop. Mas isso:

echo "foo
bar" | GREP bar

me dá:

bar
    
por DisplayName 28.10.2014 / 21:23

1 resposta

71

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.

    
por 28.10.2014 / 21:37