Проверьте, если alias GREPили which GREPвыводите что-нибудь
chepner
1
Вот и ты. У вас есть команда с именем GREP, которая отличается от grep. (Правда, это может быть просто жесткая ссылка или символическая ссылка на /usr/bin/grepнее, но с точки зрения оболочки это отдельная команда.)
chepner
12
Подождите, вы на Mac OS X, не так ли? HFS + сохраняет регистр по умолчанию, что означает, что если регистр имеет значение, когда вы создаете файл, но как только файл существует, поиск выполняется без учета регистра. То есть bashможет запрашивать файл с именем GREP, но файловая система считает grepсовпадение.
chepner
1
Да, потому что это Unix.
DisplayName
4
Файловые системы не зависят от операционной системы. Вы можете использовать другие файловые системы с Mac OS X, и вы можете (теоретически) использовать HFS + с другими операционными системами. Также вы можете сделать HFS + чувствительным к регистру; сохраняющее регистр поведение - просто значение по умолчанию по историческим причинам.
Chepner
Ответы:
71
Из ваших других вопросов я понимаю, что вы используете OS X. В файловой системе HFS + по умолчанию в OS X регистр не учитывается: у вас не может быть двух файлов с именами «abc» и «ABC» в одном каталоге, и вы пытаетесь получить доступ к ним. любое имя попадет в тот же файл. То же самое может произойти в Cygwin или с нечувствительными к регистру файловыми системами (такими как FAT32 или ciopfs ) где угодно.
Поскольку grepэто настоящий исполняемый файл, он был найден в файловой системе (в каталогах PATH). Когда ваша оболочка выглядит в /usr/binтечение либо grepили GREPон будет найти grepисполняемый файл.
Встроенные в оболочку не ищутся в файловой системе: поскольку они встроены, они доступны через (с учетом регистра) сравнения строк внутри самой оболочки.
$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD
typeговорит вам, что будет делать оболочка при запуске этой команды. При запуске cdвы получаете доступ к встроенному, но находите CDисполняемый файл. Для других встроенных функций встроенный модуль и исполняемый файл будут разумно совместимы (попробуйте echo), но cdэто невозможно.
хороший ответ Я собирался сказать Cygwin, что будет иметь тот же эффект.
Джошуа
@ Joshua Проблема ОП решена, но я думаю, что для дальнейших читателей вопроса ответ на основе Cygwin будет, по крайней мере, таким же полезным, как и существующий; Может быть, вы можете сделать это отдельным ответом, пусть даже коротким, и перенести его на существующий для деталей?
Фолькер Сигел
1
Почему posix требует бесполезной команды, такой как cd, и почему внутренний cd в osx не подходит?
Джон
2
51 голосов! Я должен был просто опубликовать ответ, а не комментарий :)
chepner
1
/ usr / bin / cd имеет цель. синтаксис / usr / bin / cd
alias GREP
илиwhich GREP
выводите что-нибудьGREP
, которая отличается отgrep
. (Правда, это может быть просто жесткая ссылка или символическая ссылка на/usr/bin/grep
нее, но с точки зрения оболочки это отдельная команда.)bash
может запрашивать файл с именемGREP
, но файловая система считаетgrep
совпадение.Ответы:
Из ваших других вопросов я понимаю, что вы используете 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
исполняемый файл. Для других встроенных функций встроенный модуль и исполняемый файл будут разумно совместимы (попробуйтеecho
), ноcd
это невозможно.источник