Tại sao thiết bị đầu cuối nhạy cảm?


12

Khi tôi làm - CD ..thay vì cd ..
nó báo lỗi -

CD: command not found

Tại sao trường hợp đầu cuối nhạy cảm khi nói đến các lệnh linux? Ý tôi là bạn sẽ có thể thực thi lệnh bằng các ký tự "tất cả chữ hoa" hoặc "tất cả chữ thường".

Tôi biết đó là do một số lý do, nhưng tôi chỉ tò mò.


9
Tôi gần như cảm thấy câu hỏi này nên được đặt tên lại Tại sao mọi thứ lại phân biệt chữ hoa chữ thường?
kojiro

15
"Ý tôi là bạn sẽ có thể thực thi lệnh bằng các ký tự" tất cả chữ hoa "hoặc" tất cả chữ thường ". Có thật không? Tại sao?
dmckee --- ex-moderator mèo con

5
Phát hành stty iuclc olcucnếu bạn cảm thấy muốn có một thiết bị đầu cuối không nhạy cảm ;-)
Stéphane Chazelas

1
CapsLock + c + d + CapsLock kém hơn c + d
UniversallyUniqueID

Câu trả lời:


43

Cuối cùng, đó là một lựa chọn tùy ý được tạo ra bởi những người tạo ra Unix hơn bốn thập kỷ trước. Họ có thể đã chọn làm cho mọi thứ trở nên không nhạy cảm như những người tạo ra MS-DOS đã làm một thập kỷ sau đó, nhưng điều đó cũng có nhược điểm.

Bây giờ nó quá sâu trong văn hóa * ix để thay đổi. Các trường hợp hệ thống tập tin nhạy cảm vấn đề nuôi dưỡng bởi eppesuig chỉ là một phần của nó. các hệ thống macOS - dựa trên Unix - thường có các hệ thống tệp không phân biệt chữ hoa chữ thường (nhưng bảo quản trường hợp), do đó, trên các hệ thống như vậy, các lệnh bên ngoài vỏ thực tế được xử lý không phân biệt chữ hoa chữ thường. Nhưng, nội dung nhưcd vẫn còn phân biệt chữ hoa chữ thường.

Ngay cả với một hệ thống tập tin không phân biệt chữ hoa chữ thường, lịch sử của những thứ âm mưu chống lại mong muốn của bạn, Hussain. Nếu tôi gõ lstrên máy Mac, tôi sẽ nhận được một danh sách thư mục được tô màu. Nếu tôi gõ LSthay vào đó, /bin/lsvẫn chạy, nhưng danh sách không được tô màu vì bí danh thêm -Ccờ là phân biệt chữ hoa chữ thường.

Tốt nhất chỉ cần làm quen với nó. Nếu bạn có thể, hãy học cách thích nó.


1
Thực tế tên tệp Windows có thể phân biệt chữ hoa chữ thường. Ví dụ, chúng nằm trong hệ thống con POSIX và xem msdn.microsoft.com/en-us/l
Library / ee681827% 28v = vs85% 29.aspx

3
Thật đáng ngạc nhiên vì một số thiết bị đầu cuối phổ biến có sẵn tại thời điểm đó chỉ có chữ hoa và chúng phải thực hiện một cách giải quyết (đặt dấu gạch chéo ngược trước một chữ cái nếu bạn muốn nó thực sự được viết hoa - nếu bạn nhập tên người dùng bằng chữ hoa khi bạn đăng nhập trong) trong trình điều khiển kỷ luật dòng.
Random832

8

Đây không phải là một vấn đề "thiết bị đầu cuối", nó là một tính năng hệ thống tập tin. Shell nên tìm kiếm các lệnh của bạn trên hệ thống tệp (luôn luôn phân biệt chữ hoa chữ thường) như thế nào?


Và nếu hai hoặc nhiều lệnh khớp nhau thì sao?
scai

1
Tùy chọn duy nhất có thể giúp bạn một chút là một bashtùy chọn được gọi là cdspell: nó cố gắng tìm tên tệp chính xác ngay cả khi bạn sai nó, nhưng nó chỉ hoạt động cho các đối số lệnh .
eppesuig

1
@HussainTamboli Có thể được lệnh đặt tên cd, CD, cDCdmỗi một hành vi độc đáo.
scai

6
Đây không thực sự là một tính năng hệ thống tệp hoặc tính năng đầu cuối - đó là tính năng hệ vỏ. Shell dựng sẽ phân biệt chữ hoa chữ thường trên hệ thống tệp không phân biệt chữ hoa chữ thường. Ngoài ra, hầu hết các lệnh băm shell, vì vậy các lệnh không bao giờ là tệp thực sự , chúng thực sự được rút ra từ hàm băm. Hãy thử hash -p /bin/hostname HOSTNAMEvà bây giờ HOSTNAMElà lệnh cho /bin/hostname.
kojiro

2
Ồ, tôi cũng nên đề cập đến việc bạn có thể nói với hầu hết các vỏ là ít phân biệt chữ hoa chữ thường. Đối với bash, bạn có thể liên kết set completion-ignore-case on.
kojiro

6

Các hệ thống kỹ thuật mà tôi sử dụng và tôn trọng hầu như chỉ phân biệt chữ hoa chữ thường: có thể là hệ điều hành hoặc ngôn ngữ lập trình hoặc bất cứ thứ gì khác.

Các ngoại lệ tôi có thể nghĩ ra ngay bây giờ là các thẻ HTML và một số triển khai SQL và ngôn ngữ lập trình Ada.

Ngay cả trong những trường hợp đó, tôi nghĩ rằng có xu hướng mạnh mẽ để thực sự viết các thẻ HTML bằng chữ thường và ngữ nghĩa truy vấn SQL bằng chữ in hoa (và các tham số viết hoa). (Sửa tôi nếu tôi sai.) Đối với Ada, chế độ Emacs sẽ sửa cho bạn nếu bạn nhập tên thủ tục chữ thường, mặc dù điều đó không quan trọng khi biên dịch. Vì vậy, ngay cả khi có trường hợp không nhạy cảm, có vẻ như mọi người đồng ý rằng đó là một ý tưởng tồi.

Lý do là bạn có được sức mạnh biểu cảm hơn nhiều với tính nhạy cảm của trường hợp. Không chỉ số lượng - CDlà một, nhưng CD, Cd, cD, và cdbốn - nhưng quan trọng hơn, bạn có thể bày tỏ mục đích, tầm quan trọng, vv bằng cách sử thượng và chữ thường hợp lý; Ngoài ra, khi lập trình, bạn sẽ tăng cường khả năng đọc.

Theo trực giác, rõ ràng là bạn không đọc hiHIcùng một cách!

Nhưng, để cho bạn một ví dụ về thế giới máy tính, trong ngôn ngữ lập trình Ada (từ những năm 1980), dòng đầu tiên của khối mã thủ tục có thể trông như thế này:

procedure body P(SCB : in out Semaphore_Control_Block) is

như bạn thấy, các tên thủ tục và tham số được viết hoa, cũng như các kiểu dữ liệu, mọi thứ khác đều là chữ thường. Cũng lưu ý rằng tên tham số "tất cả chữ hoa" cho chúng ta biết rằng đó là từ viết tắt. Bây giờ, so sánh điều này với

procedure body p(scb : in out semaphore_control_block) is

Điều này là có thể, vì Ada không phân biệt chữ hoa chữ thường (hoặc chính xác hơn, trình biên dịch sẽ thay đổi nó theo cách trong ví dụ đầu tiên của tôi, nhưng tất nhiên sẽ không thay đổi mã của bạn). Hoặc, làm thế nào về:

PROCedure body P(Scb : IN Out semaphore_CONTROL_BLOCK) iS

Đó là một chút vô lý, tôi biết; nhưng ai đó sẽ đủ ngu ngốc để viết nó theo cách đó (tốt, có lẽ là không). Vấn đề là, một hệ thống phân biệt chữ hoa chữ thường sẽ không chỉ buộc mọi người phải nhất quán, họ cũng sẽ được nó giúp đỡ (khả năng đọc) và sử dụng nó để làm lợi thế của họ (ví dụ viết tắt ở trên).


2
Pascal và Delphi cũng không phân biệt chữ hoa chữ thường. Ngoài ra, có hai ví dụ lengthLengththường là một ý tưởng tồi :)
Ajasja

@Ajasja: Điều đó thật thú vị, vì Ada rất giống Pascal. Chà, tôi đoán nếu bạn đếm tất cả, sẽ có hàng tấn ngôn ngữ như vậy, bởi vì có rất nhiều ngôn ngữ lập trình. Tất nhiên, về độ dài - nhưng bạn có thể nghĩ về một số trường hợp như vậy: còn Max (một người) và max (một hàm lấy danh sách thực và trả về giá trị lớn nhất) thì sao?
Emanuel Berg

Về ví dụ cuối cùng của bạn, bạn có thể muốn biết rằng trình thông dịch SuperBasic của QL đã viết hoa các từ khóa theo cách chính xác: DEFine PROCedure Hellochẳng hạn. Bạn chỉ phải nhập các bit viết hoa, nhưng từ đầy đủ xuất hiện trong danh sách chương trình. Điều này cũng được áp dụng cho REMark, và không gây phiền nhiễu ...
David đưa ra

4

Không có gì lạ hơn là chúng ta có một bảng chữ cái viết hoa và viết thường. Nếu bạn nhìn vào /usr/bin, bạn sẽ nhận thấy (rất) một vài thực thi khai thác viết hoa.

Một không gian tên phân biệt chữ hoa chữ thường không lớn gấp đôi so với không phân biệt - sự khác biệt tăng theo cấp số nhân với độ dài từ. Ví dụ: sử dụng 26 ký tự, có 26 ^ 3 (17576) khả năng khác nhau trong ba chữ cái; sử dụng 52 (2 * 26) ký tự có 52 ^ 3 = 140608. Một không gian tên mở là một điều tốt;)


Bạn đã lấy 3 từ đâu?
ctrl-alt-delor

@ ctrl-alt-delor Đây chỉ là một ví dụ: "có 26 ^ 3 (17576) khả năng khác nhau trong ba chữ cái ".
goldilocks

2

Khái niệm trường hợp "trên / dưới" có thể (và thực sự) là một điều cụ thể cục bộ, vì, bất kỳ biến chứng thiết kế nào khác phải được đẩy càng gần điểm sử dụng càng tốt trong ngăn xếp ứng dụng, không phải là một phần của cốt lõi.

Có môi trường nhạy cảm trường hợp cho phép bọc nó vào môi trường không nhạy cảm trường hợp, nhưng không phải cách khác.


1

Nó không phải là thiết bị đầu cuối, nó là hệ thống tập tin. Hoặc trong trường hợp cd(cd là shell được tích hợp sẵn), đó là trường hợp nhạy cảm.

Điều đó có thể xảy ra (ít nhất là với ASCII), để làm cho trường hợp không nhạy cảm. Điều này khó hơn với unicode hiện được sử dụng (cho dù hai ký tự giống nhau, có thể phụ thuộc vào cục bộ).

Phải làm gì về nó

  • Sống với nó.
  • Hãy thử các tùy chọn vỏ này. Họ đưa ra một thỏa hiệp, và làm cho mọi thứ dễ dàng hơn, mà không đưa ra tất cả các vấn đề về sự vô cảm của trường hợp.
    • shopt -s nocaseglob # đây là trong tôi ~/.bashrc
    • shopt -s nocasematch # cũng sẽ có trong ~/.bashrc
    • set completion-ignore-case on # đây là trong tôi ~/.inputrc

-2

Là một điểm khởi đầu, lý do câu hỏi này đã được hỏi và lý do bạn sẽ tìm thấy nhiều cuộc thảo luận về nó nếu bạn Google chủ đề, đó là sự nhạy cảm trường hợp làm cho những người "bình thường" khó học và sử dụng ngôn ngữ lập trình hoặc dòng lệnh giao diện.

Trường hợp nhạy cảm có nguồn gốc từ sức mạnh thấp của máy tính trong quá khứ. Để làm cho mọi thứ không nhạy cảm, cần một thao tác phân tích cú pháp bổ sung trước khi lệnh được đưa đến trình thông dịch hoặc trình biên dịch trước khi thực thi và các nhà thiết kế ban đầu không sẵn sàng lãng phí năng lượng của máy tính để thuận tiện cho độ nhạy của vỏ.

Tôi tin rằng có một số khẳng định không chính xác trong các ý kiến ​​được đưa ra ở trên. Đầu tiên, các nhà tâm lý học sẽ nói với bạn rằng con người không tự động phân biệt giữa một từ được viết bằng chữ in hoa hoặc in thường hoặc thậm chí là kết hợp cả hai theo nghĩa của từ đó. Case được sử dụng trong các ngôn ngữ biểu cảm thông thường để truyền đạt một ý nghĩa bổ sung. Ví dụ, việc sử dụng chữ in hoa bắt đầu một từ trong câu, cho biết đó có lẽ là một danh từ thích hợp. Chữ in hoa cũng được sử dụng để đưa ra cấu trúc văn xuôi. Ví dụ, một chữ in hoa, được sử dụng để chỉ sự bắt đầu của một câu. Nhưng "Từ" và "từ" được tâm trí con người xem là có nghĩa giống nhau.

Những người tạo ra DOS và ADA và Pascal, để nêu tên một số người, đánh giá cao rằng độ nhạy trường hợp là một gánh nặng thêm cho người mới bắt đầu. Sau đó, các trình soạn thảo văn bản trong "Môi trường phát triển tích hợp" (IDE), nhận ra một từ dự trữ, có thể gọi lại từ đó sao cho phù hợp với phong cách; cộng với hiển thị nó trong một màu sắc khác nhau để làm cho từ nổi bật. Vì vậy, đối số mà phân biệt chữ hoa chữ thường làm cho mã dễ đọc hơn là sai lầm. Nó không cho người "bình thường". Nó chỉ đơn giản là thêm một lớp không cần thiết và đôi khi khó hiểu vào một nhiệm vụ đã đòi hỏi.

Java là một ví dụ cực đoan về một ngôn ngữ rất kém theo quan điểm về sự dễ sử dụng của người mới bắt đầu. Nó thi hành độ nhạy trường hợp nghiêm ngặt, nhưng, ngu ngốc, sẽ cho phép lập trình viên có hai hàm, cả hai cùng tên, nhưng thực sự là các hàm khác nhau bởi thực tế người này có một bộ đối số khác. Thật vậy, Java là một ngôn ngữ phá thai đến mức khi các trường đại học chuyển từ dạy cú pháp Pascal sang sinh viên, thực hiện các khóa học khoa học không sử dụng máy tính, tỷ lệ đỗ đã giảm từ khoảng 70% xuống 40%.

Vì vậy, tóm lại, trường hợp nhạy cảm xuất hiện vì hai lý do. Một là thiếu sức mạnh máy tính. Thứ hai là những người tìm đường vào khoa học máy tính thường nằm trong phổ tự kỷ và không liên quan tốt đến nhu cầu của những người "bình thường". Do đó, những người này không thể đánh giá cao sự nhạy cảm của trường hợp là không cần thiết và cản trở việc học và sử dụng ngôn ngữ lập trình.


Tôi sẽ loại bỏ phần trên Java bởi vì nó là imho, dựa trên quan điểm và bên cạnh điểm (quá tải phương thức không liên quan nhiều đến phân biệt chữ hoa chữ thường) ... quá tải phương thức / hàm cũng được tìm thấy trong các ngôn ngữ khác, chẳng hạn như C ++ và pl / sql để đặt tên nhưng hai. Đối với đoạn tâm lý của bạn, tôi nghĩ các nguồn sẽ tốt ... Cuối cùng, đoạn cuối là, imho, dựa trên quan điểm cũng như gây khó chịu và nên được loại bỏ.
thecarpy

Để cho bạn hiểu rõ hơn về lý do tại sao C và tất cả các ngôn ngữ được sinh ra từ nó đã gây thiệt hại cho nguyên nhân của khoa học máy tính, vui lòng truy cập; linkin.com/pulse/âu Cốt lõi của vấn đề này, hay tôi nên nói là kernel :-), là các lập trình viên thuộc loại tính cách không quan tâm đến việc truyền bá kiến ​​thức mà là hoàn thành công việc. Nếu bạn không đồng ý với những gì đã được nói trong bài viết này thì vui lòng đưa ra một lập luận để chứng minh tư thế của bạn. Ý kiến ​​được tính cho ít.
Kevin Loughrey

Tôi đồng ý rằng trường hợp nhạy cảm làm cho việc học tập khó hơn. Nhưng lưu ý rằng hầu hết mọi thứ trong Unix đều là chữ thường, vì vậy hãy giữ nguyên như vậy. Một ngoại lệ chính là các biến môi trường theo quy ước là tất cả các thủ đô.
ctrl-alt-delor

Trường hợp nên được sử dụng nhất quán , và như đã nói trong câu trả lời này để truyền đạt thông tin bổ sung, ví dụ biến môi trường so với biến vỏ bình thường.
ctrl-alt-delor

-2

Phân biệt chữ hoa chữ thường là một ý tưởng ngớ ngẩn xuất hiện vì các nhà văn Unix không hiểu rằng ASCII được thiết kế để dễ phân biệt chữ hoa chữ thường. Một cách đơn giản là bỏ qua các bit hàng đầu. Ascii là mã 7 bit có chữ A ở giá trị bit thập phân 65 1000001 và mã thập phân bit 97 1100001. với các chữ cái theo thứ tự abc. Điều này tạo ra tất cả các loại ý tưởng, chẳng hạn như tất cả các khóa trong các cặp giá trị khóa phải là số để tránh Dép khác với dép. Chọn cơ sở dữ liệu Đa giá trị nhận ra điều này ngay từ đầu và không phân biệt chữ hoa chữ thường.


2
"Ngớ ngẩn" là ý kiến ​​của bạn. Có rất ít thực tế trong câu trả lời này mà tôi có thể thấy. Ồ, và tại sao lại giới hạn bản thân với ASCII. Có cả EBCDIC nữa.
roaima
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.