Tại sao các nội trang Shell không thể chạy bằng chữ in hoa nhưng các lệnh khác có thể?


33

Tại sao lại thế này?

Khi tôi làm điều này

CD ~/Desktop

Nó không đưa tôi đến Desktop. Nhưng điều này:

echo "foo
bar" | GREP bar

đưa cho tôi:

bar

4
Kiểm tra nếu alias GREPhoặc which GREPđầu ra bất cứ điều gì.
chepner

1
Có bạn đi. Bạn có một lệnh được đặt tên GREP, khác với grep. (Đúng, nó có thể chỉ là một liên kết cứng hoặc liên kết tượng trưng đến /usr/bin/grep, nhưng theo quan điểm của shell, đó là một lệnh riêng biệt.)
chepner

12
Đợi đã: bạn đang dùng Mac OS X phải không? HFS + được bảo quản theo trường hợp theo mặc định, điều đó có nghĩa là nếu trường hợp quan trọng khi bạn tạo tệp, nhưng một khi tệp tồn tại, việc tra cứu không phân biệt chữ hoa chữ thường. Đó là, bashcó thể yêu cầu một tệp có tên GREP, nhưng hệ thống tệp xem xét grepkhớp.
chepner

1
Vâng, bởi vì nó là Unix.
DisplayName

4
Hệ thống tập tin độc lập với hệ điều hành. Bạn có thể sử dụng các hệ thống tệp khác với Mac OS X và về lý thuyết bạn có thể sử dụng HFS + với các hệ điều hành khác. Ngoài ra, bạn có thể làm cho HFS + phân biệt chữ hoa chữ thường; hành vi bảo quản trường hợp chỉ là mặc định vì lý do lịch sử.
chepner

Câu trả lời:


71

Từ những câu hỏi khác của bạn, tôi cho rằng bạn đang sử dụng OS X. Hệ thống tệp HFS + mặc định trên OS X không phân biệt chữ hoa chữ thường: bạn không thể có hai tệp gọi là "abc" và "ABC" trong cùng thư mục và cố gắng truy cập một trong hai tên sẽ nhận được cùng một tập tin. Điều tương tự có thể xảy ra dưới Cygwin, hoặc với các hệ thống tệp không phân biệt chữ hoa chữ thường (như FAT32 hoặc ciopfs ) ở bất cứ đâu.

Bởi vì greplà một thực thi thực sự, nó tìm kiếm trên hệ thống tập tin (trong các thư mục của PATH). Khi vẻ ngoài vỏ của bạn trong /usr/bincho một trong hai grephoặc GREPnó sẽ tìm ra grepthực thi.

Các nội trang của Shell không được tra cứu trên hệ thống tập tin: bởi vì chúng được tích hợp sẵn, chúng được truy cập thông qua các so sánh chuỗi (phân biệt chữ hoa chữ thường) bên trong chính trình bao.

Những gì bạn gặp phải là một trường hợp thú vị. Trong khi cdlà một dựng sẵn, truy cập trường hợp nhạy cảm, CDđược tìm thấy như là một thực thi /usr/bin/cd. Việc cdthực thi là khá vô dụng: vì cdảnh hưởng đến môi trường thực thi shell hiện tại, nó luôn được cung cấp dưới dạng shell được tích hợp thường xuyên , nhưng dù sao cũng có thể cdthực thi vì lợi ích của POSIX , nó thay đổi thư mục cho chính nó và sau đó chấm dứt ngay lập tức nó bắt đầu từ đâu

Bạn có thể thử những thứ này với typenội dung :

$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD

typecho bạn biết shell sẽ làm gì khi bạn chạy lệnh đó. Khi bạn chạy, cdbạn truy cập vào nội dung, nhưng CDtìm thấy tệp thực thi. Đối với các nội dung khác, nội dung dựng sẵn và thực thi sẽ tương thích hợp lý (thử echo), nhưng đối với cdđiều đó là không thể.


1
câu trả lời tốt. Tôi đã định nói cygwin, sẽ có tác dụng tương tự.
Joshua

@Joshua Vấn đề của OP đã được giải quyết, nhưng tôi nghĩ đối với những độc giả tiếp theo của câu hỏi, một câu trả lời dựa trên cygwin sẽ ít nhất hữu ích như câu hỏi hiện có; Có lẽ bạn có thể làm cho câu trả lời này riêng biệt, ngay cả khi ngắn và trả lời câu hỏi hiện có để biết chi tiết?
Volker Siegel

1
Tại sao posix yêu cầu một lệnh vô dụng như cd và tại sao cd nội bộ của osx không đủ điều kiện?
John

2
51 lượt ủng hộ! Tôi chỉ nên đăng một câu trả lời, thay vì một bình luận :)
chepner

1
/ usr / bin / cd có mục đích. cú pháp là / usr / bin / cd đối số chương trình thư mục
Joshua
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.