Чому вбудовані програми Shell не можуть бути запущені великими літерами, а інші команди?


33

Чому це?

Коли я це роблю

CD ~/Desktop

Це не бере мене на робочий стіл. Але це:

echo "foo
bar" | GREP bar

дає мені:

bar

4
Перевірте, alias GREPчи which GREPщось виведіть.
чепнер

1
Ось так. У вас є названа команда GREP, яка відрізняється від grep. (Правда, це може бути просто жорстке посилання або символічне посилання на /usr/bin/grep, але, з точки зору оболонки, це окрема команда.)
chepner

12
Зачекайте: ви на Mac OS X, чи не так? HFS + зберігає регістр за замовчуванням, це означає, що якщо справа має значення під час створення файлу, але коли файл існує, пошукові записи не залежать від регістру. Тобто, bashможе запитати файл з назвою GREP, але файлова система розглядає grepвідповідність.
чепнер

1
Так, тому що це Unix.
DisplayName

4
Файлові системи не залежать від операційної системи. Ви можете використовувати інші файлові системи з Mac OS X, а ви можете (теоретично) використовувати HFS + з іншими операційними системами. Також ви можете зробити HFS + з урахуванням регістру; поведінка, що зберігає випадок, є лише за замовчуванням з історичних причин.
чепнер

Відповіді:


71

З ваших інших питань я вважаю, що ви використовуєте 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це неможливо.


1
гарна відповідь. Я збирався сказати cygwin, що матиме той же ефект.
Джошуа

@ Джошуа Проблема ОР вирішена, але я думаю, що для подальших читачів питання відповідь, що базується на цигуніні, буде принаймні такою ж корисною, як і існуюча; Можливо, ви можете зробити це окремою відповіддю, навіть якщо короткою, і відклавши до існуючої деталі?
Волкер Зігель

1
Чому для posix потрібна така непотрібна команда, як CD, і чому внутрішній cd osx не кваліфікується?
Джон

2
51 випуск! Я повинен був щойно опублікувати відповідь, а не коментар :)
chepner

1
/ usr / bin / cd має призначення. синтаксис - аргументи програмного каталогу каталогу / usr / bin / cd
Джошуа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.