Z pozostałych twoich pytań rozumiem, że używasz OS X. Domyślny system plików HFS + w OS X nie rozróżnia wielkości liter: nie możesz mieć dwóch plików o nazwach „abc” i „ABC” w tym samym katalogu i próbować uzyskać dostęp każda nazwa przejdzie do tego samego pliku. To samo może się zdarzyć w Cygwin lub w systemach plików bez rozróżniania wielkości liter (takich jak FAT32 lub ciopfs ) w dowolnym miejscu.
Ponieważ grepjest to prawdziwy plik wykonywalny, został sprawdzony w systemie plików (w katalogach PATH). Kiedy twoja powłoka szuka /usr/binjednego z nich greplub GREPznajdzie grepplik wykonywalny.
Wbudowane powłoki nie są wyszukiwane w systemie plików: ponieważ są wbudowane, są one dostępne poprzez porównania łańcuchów (z rozróżnianiem wielkości liter) w samej powłoce.
To, co napotykasz, jest ciekawym przypadkiem. Chociaż cdjest wbudowany, dostępny z rozróżnianiem wielkości liter, CDmożna go znaleźć jako plik wykonywalny /usr/bin/cd. Plik cdwykonywalny jest dość bezużyteczny: ponieważ cdwpływa na bieżące środowisko wykonywania powłoki, zawsze jest dostarczany jako zwykła wbudowana powłoka , ale mimo to istnieje cdplik wykonywalny ze względu na POSIX , który zmienia katalog dla siebie, a następnie natychmiast kończy działanie, pozostawiając otaczającą powłokę gdzie to się zaczęło.
Możesz wypróbować te z typewbudowanym :
$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD
typemówi ci, co zrobi powłoka po uruchomieniu tego polecenia. Po uruchomieniu cduzyskujesz dostęp do wbudowanego, ale CDznajduje plik wykonywalny. W przypadku innych wbudowanych wbudowane i pliki wykonywalne będą w miarę kompatybilne (try echo), ale cdnie jest to możliwe.
alias GREPczywhich GREPcoś wyprowadzasz.