Из ваших других вопросов я понимаю, что вы используете OS X. В файловой системе HFS + по умолчанию в OS X регистр не учитывается: у вас не может быть двух файлов с именами «abc» и «ABC» в одном каталоге, и вы пытаетесь получить доступ к ним. любое имя попадет в тот же файл. То же самое может произойти в Cygwin или с нечувствительными к регистру файловыми системами (такими как FAT32 или ciopfs ) где угодно.
Поскольку grepэто настоящий исполняемый файл, он был найден в файловой системе (в каталогах PATH). Когда ваша оболочка выглядит в /usr/binтечение либо grepили GREPон будет найти grepисполняемый файл.
Встроенные в оболочку не ищутся в файловой системе: поскольку они встроены, они доступны через (с учетом регистра) сравнения строк внутри самой оболочки.
То, с чем вы сталкиваетесь, - интересный случай. В то время как cdявляется встроенным, доступ к нему с учетом регистра, CDнаходится в качестве исполняемого файла /usr/bin/cd. cdИсполняемое довольно бесполезно: потому что cdвлияет на текущую среду выполнения оболочки, она всегда предоставляются в качестве оболочки обычного встроенных , но есть cdисполняемый ради Posix в любом случае, который изменяет каталог для себя , а затем сразу же заканчивается, оставляя окружающую оболочку где это началось
Вы можете попробовать это с помощью typeвстроенного :
$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD
typeговорит вам, что будет делать оболочка при запуске этой команды. При запуске cdвы получаете доступ к встроенному, но находите CDисполняемый файл. Для других встроенных функций встроенный модуль и исполняемый файл будут разумно совместимы (попробуйте echo), но cdэто невозможно.
alias GREPилиwhich GREPвыводите что-нибудь