Из ваших других вопросов я понимаю, что вы используете 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
выводите что-нибудь