ทำไมเทอร์มินัลเป็นกรณี ๆ


13

เมื่อฉันทำ - CD ..แทนที่จะcd ..
ทำให้ฉันผิดพลาดว่า -

CD: command not found

ทำไมเทอร์มินัลคำนึงถึงขนาดตัวพิมพ์เมื่อมาถึงคำสั่ง linux? ฉันหมายความว่าคุณควรจะสามารถรันคำสั่งด้วยอักขระ "all uppercase" หรือ "all all lowercase"

ฉันรู้ว่ามันเป็นเพราะเหตุผลบางอย่าง แต่ฉันแค่อยากรู้


9
ฉันเกือบรู้สึกว่าคำถามนี้ควรตั้งชื่อใหม่ทำไมสิ่งต่าง ๆ ต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก
kojiro

15
"ฉันหมายความว่าคุณควรจะสามารถรันคำสั่งด้วยอักขระ" all uppercase "หรือ" all all lowercase " จริงๆ? ทำไม?
dmckee --- ผู้ดูแลอดีตลูกแมว

5
ออก a stty iuclc olcucถ้าคุณรู้สึกว่ามีตัวพิมพ์เล็กและตัวพิมพ์เล็ก;
Stéphane Chazelas

1
CapsLock + c + d + CapsLock แย่กว่า c + d
UniversallyUniqueID

คำตอบ:


43

ในที่สุดมันเป็นทางเลือกโดยผู้สร้าง Unix เมื่อสี่สิบปีที่แล้ว พวกเขาอาจเลือกที่จะทำสิ่งเล็ก ๆ น้อย ๆ แบบตัวพิมพ์เล็กอย่างที่ผู้สร้างของ MS-DOS ทำในอีกสิบปีต่อมา แต่ก็มีข้อเสียเช่นกัน

มันฝังลึกเกินไปในวัฒนธรรม * ix ที่จะเปลี่ยนตอนนี้ กรณีปัญหาระบบแฟ้มที่มีความสำคัญนำขึ้นโดย eppesuigเป็นเพียงส่วนหนึ่งของมัน ระบบ macOS - ซึ่งใช้ Unix - โดยทั่วไปจะมีระบบไฟล์แบบ case-insensitive (แต่เป็นแบบ case-keeping) ดังนั้นระบบดังกล่าวคำสั่งภายนอก shell จะได้รับการจัดการแบบ case-insensitively แต่บิวอินเช่นcdยังคงเป็นกรณี ๆ ไป

แม้จะมีระบบไฟล์แบบไม่ตรงตามตัวพิมพ์เล็ก แต่ประวัติศาสตร์ของสิ่งต่าง ๆ สมคบกับความต้องการของคุณฮุสเซน ถ้าฉันพิมพ์lsบน Mac ของฉันฉันจะได้รับรายชื่อไดเรกทอรี colorized หากฉันพิมพ์LSแทน/bin/lsยังคงทำงานอยู่ แต่รายชื่อไม่ได้เป็นสีเนื่องจากชื่อแทนที่เพิ่ม-Cค่าสถานะเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก

ดีที่สุดเพิ่งได้ใช้มัน หากคุณสามารถเรียนรู้ที่จะชอบมัน


1
ชื่อไฟล์ Windows ที่แท้จริงอาจเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก พวกเขาอยู่ในระบบย่อย POSIX และดูmsdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspx
fpmurphy

3
เป็นเรื่องที่น่าแปลกใจจริงๆเนื่องจากเทอร์มินัลทั่วไปที่มีอยู่ในขณะนั้นเป็นตัวพิมพ์ใหญ่เท่านั้นและพวกเขาต้องใช้วิธีแก้ปัญหา (ใส่แบ็กสแลชต่อหน้าตัวอักษรหากคุณต้องการให้มันเป็นตัวพิมพ์ใหญ่จริงๆใน) ในไดรเวอร์วินัยของบรรทัด
Random832

8

นี่ไม่ใช่ปัญหา "เทอร์มินัล" มันเป็นคุณสมบัติของระบบไฟล์ เชลล์ควรมองหาคำสั่งของคุณในระบบไฟล์ (คำนึงถึงขนาดตัวพิมพ์เล็ก) เสมอ?


และถ้าคำสั่งสองคำขึ้นไปตรงกับอะไร?
scai

1
ตัวเลือกเดียวที่อาจช่วยคุณได้นิดหน่อยคือbashตัวเลือกที่เรียกว่าcdspell: ลองค้นหาชื่อไฟล์ที่ถูกต้องแม้ว่าคุณจะทำผิด แต่มันก็ใช้ได้กับอาร์กิวเมนต์ของคำสั่งเท่านั้น
eppesuig

1
@HussainTamboli อาจจะมีคำสั่งตั้งชื่อcd, CD, cDและCdแต่ละคนมีพฤติกรรมที่ไม่ซ้ำกัน
scai

6
ไม่ใช่คุณสมบัติระบบไฟล์หรือคุณสมบัติเทอร์มินัล - เป็นคุณสมบัติของเชลล์ เชลล์บิวด์อินจะคำนึงถึงขนาดตัวพิมพ์ นอกจากนี้คำสั่ง hash ของ shells ส่วนใหญ่ดังนั้นคำสั่งจะไม่เป็นไฟล์จริงๆพวกมันถูกดึงมาจาก hash ลองhash -p /bin/hostname HOSTNAMEและตอนนี้เป็นคำสั่งสำหรับHOSTNAME /bin/hostname
kojiro

2
โอ้ฉันควรจะพูดถึงว่าคุณสามารถบอกได้ว่ากระสุนปืนส่วนใหญ่นั้นไวต่อตัวพิมพ์เล็ก set completion-ignore-case onสำหรับทุบตีคุณสามารถผูก
kojiro

6

ระบบทางเทคนิคที่ฉันใช้และเคารพนั้นคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: ไม่ว่าจะเป็นระบบปฏิบัติการหรือภาษาการเขียนโปรแกรมหรืออย่างอื่น

ข้อยกเว้นที่ฉันคิดได้ตอนนี้คือแท็ก HTML และการใช้งานบางอย่างของ SQL และภาษาการเขียนโปรแกรม Ada

แม้ในกรณีเหล่านั้นฉันคิดว่ามีแนวโน้มที่แข็งแกร่งในการเขียนแท็ก HTML ในตัวพิมพ์เล็กจริง ๆ และซีแมนทิกส์การสืบค้น SQL เป็นตัวพิมพ์ใหญ่ (และพารามิเตอร์พิมพ์ใหญ่) (แก้ไขให้ฉันถ้าฉันผิด) สำหรับ Ada โหมด Emacs จะแก้ไขให้คุณถ้าคุณพิมพ์ชื่อกระบวนงานตัวพิมพ์เล็กแม้ว่าจะไม่สำคัญเมื่อคอมไพล์ ดังนั้นแม้ว่าจะมีความรู้สึกตัวพิมพ์เล็ก แต่ก็ดูเหมือนว่าผู้คนยอมรับว่าเป็นความคิดที่ไม่ดี

เหตุผลก็คือคุณได้รับพลังการแสดงออกที่มากขึ้นพร้อมความไวต่อตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ไม่เพียง แต่เชิงปริมาณ - CDเป็นหนึ่ง แต่CD, CdและcD, และcdสี่ - แต่ที่สำคัญกว่านั้นคุณสามารถแสดงวัตถุประสงค์, เน้น, ฯลฯ โดยใช้บน - และตัวพิมพ์เล็กอย่างสมเหตุสมผล; นอกจากนี้เมื่อเขียนโปรแกรมคุณจะเพิ่มความสามารถในการอ่าน

สังหรณ์ใจเป็นที่ชัดเจนว่าคุณไม่ได้อ่านhiและHIวิธีเดียวกัน!

แต่เพื่อให้เป็นตัวอย่างโลกคอมพิวเตอร์ให้คุณในภาษาการเขียนโปรแกรม Ada (จากทศวรรษ 1980) บรรทัดแรกของบล็อคโค้ดโพรซีเดอร์อาจมีลักษณะดังนี้:

procedure body P(SCB : in out Semaphore_Control_Block) is

อย่างที่คุณเห็นชื่อกระบวนงานและพารามิเตอร์จะเป็นตัวพิมพ์ใหญ่เช่นเดียวกับประเภทข้อมูลทุกอย่างอื่นเป็นตัวพิมพ์เล็ก โปรดทราบว่าชื่อพารามิเตอร์ "all uppercase" จะบอกเราว่าเป็นตัวย่อ ตอนนี้เปรียบเทียบสิ่งนี้กับ

procedure body p(scb : in out semaphore_control_block) is

สิ่งนี้อาจเป็นไปได้เนื่องจาก Ada เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (หรือแน่นอนผู้แปลจะเปลี่ยนเป็นวิธีในตัวอย่างแรกของฉัน แต่แน่นอนว่าจะไม่เปลี่ยนรหัสของคุณ) หรือวิธีการเกี่ยวกับ:

PROCedure body P(Scb : IN Out semaphore_CONTROL_BLOCK) iS

ฉันรู้ว่ามันไร้สาระนิดหน่อย แต่บางคนอาจจะงี่เง่าพอที่จะเขียนด้วยวิธีนั้น (อาจจะไม่ใช่) ประเด็นคือระบบที่เล็กและใหญ่จะไม่เพียง แต่บังคับให้คนต้องมีความสอดคล้องกันเท่านั้นพวกเขายังจะได้รับความช่วยเหลือจากมัน (ความสามารถในการอ่านได้) และใช้มันเพื่อประโยชน์ของพวกเขา


2
Pascal และ Delphi นั้นไม่คำนึงถึงขนาดตัวพิมพ์ นอกจากนี้ยังมีตัวอย่างสองตัวแปรlengthและLengthมักจะเป็นความคิดที่ไม่ดี :)
Ajasja

@Ajasja: น่าสนใจเพราะ Ada เป็นเหมือน Pascal มาก ฉันเดาว่าถ้าคุณนับพวกมันทั้งหมดจะมีภาษาดังกล่าวมากมายเพราะมีภาษาโปรแกรมมากมาย สำหรับความยาวแน่นอน - แต่คุณอาจนึกถึงกรณีเช่นนี้: Max (คน) และ max (ฟังก์ชันที่รับรายการ reals และคืนที่ใหญ่ที่สุด)
Emanuel Berg

เกี่ยวกับตัวอย่างล่าสุดของคุณคุณอาจสนใจที่จะรู้ว่าตัวแปล SuperBasic ของ QL ใช้ตัวอักษรพิมพ์ใหญ่ในลักษณะนั้น: DEFine PROCedure Helloตัวอย่างเช่น คุณต้องพิมพ์บิตที่พิมพ์ใหญ่ แต่คำเต็มปรากฏในรายการโปรแกรม สิ่งนี้นำไปใช้กับREMarkและไม่น่ารำคาญ ...
เดวิดให้

4

มันไม่แปลกเลยที่เราจะมีตัวอักษรตัวพิมพ์ใหญ่และเล็กเริ่มต้นด้วย หากคุณมองเข้าไป/usr/binคุณจะสังเกตเห็นว่ามีบางโปรแกรมปฏิบัติการที่หาประโยชน์จากการใช้ประโยชน์จากตัวพิมพ์ใหญ่

เนมสเปซที่คำนึงถึงขนาดตัวพิมพ์ไม่เพียงใหญ่เป็นสองเท่าของความรู้สึกที่ไม่ไวต่อความรู้สึก เช่นการใช้อักขระ 26 ตัวมีความเป็นไปได้ที่แตกต่างกัน 26 ตัว 3 ตัว (17576) ตัวอักษรสามตัว ใช้ 52 (2 * 26) ตัวอักษรมี 52 ^ 3 = 140608 เนมสเปซเปิดเป็นสิ่งที่ดี;)


คุณได้รับ 3 จากที่ไหน
ctrl-alt-delor

@ ctrl-alt-delor มันเป็นเพียงตัวอย่าง: "มีความเป็นไปได้ที่แตกต่างกัน 26 ตัว 3 ตัว (17576) ตัวอักษรสามตัว "
goldilocks

2

แนวคิดของกรณี "บน / ล่าง" สามารถ (และแน่นอน) สถานที่เฉพาะที่ซึ่งเป็นภาวะแทรกซ้อนการออกแบบอื่น ๆ ควรผลักดันให้ใกล้เคียงกับจุดใช้งานที่เป็นไปได้ในกองใบสมัครไม่ได้เป็นส่วนหนึ่งของ แกน

การมีสภาวะแวดล้อมที่คำนึงถึงขนาดตัวพิมพ์อนุญาตให้ใส่ลงในสภาพแวดล้อมที่ไม่คำนึงถึงขนาดตัวพิมพ์ แต่ไม่ใช่วิธีอื่น ๆ


1

มันไม่ใช่เทอร์มินัล แต่เป็นระบบไฟล์ หรือในกรณีของcd(cd คือเชลล์ในตัว) เชลล์ที่คำนึงถึงขนาดตัวพิมพ์

มันอาจเป็นไปได้ (อย่างน้อยกับ ASCII) เพื่อให้เป็นกรณีตาย สิ่งนี้ยากกว่าเมื่อใช้ Unicode ที่ใช้อยู่ในขณะนี้ (ไม่ว่าอักขระสองตัวจะเหมือนกันหรือไม่ขึ้นอยู่กับท้องถิ่น)

จะทำอย่างไรกับมัน

  • อยู่กับมัน
  • ลองตัวเลือกเปลือกเหล่านี้ พวกเขาประนีประนอมและทำให้สิ่งต่าง ๆ ง่ายขึ้นโดยไม่ต้องแนะนำปัญหาทั้งหมดของกรณีตาย
    • shopt -s nocaseglob #this อยู่ในของฉัน ~/.bashrc
    • shopt -s nocasematch #this จะอยู่ด้วย ~/.bashrc
    • set completion-ignore-case on #this อยู่ในของฉัน ~/.inputrc

-2

ในฐานะที่เป็นจุดเริ่มต้นเหตุผลที่ถามคำถามนี้และเหตุผลที่คุณจะพบกับการสนทนามากมายในกรณีที่คุณเป็นผู้ใช้ Google นั่นคือความอ่อนไหวของกรณีทำให้ผู้คน "ปกติ" เรียนรู้และใช้ภาษาโปรแกรมหรือบรรทัดคำสั่งได้ยากขึ้น อินเตอร์เฟซ.

ความไวตัวเคสมีต้นกำเนิดจากพลังงานต่ำของคอมพิวเตอร์ในอดีต ในการทำให้เรื่องเล็ก ๆ น้อย ๆ ไม่ต้องดำเนินการแยกวิเคราะห์เพิ่มเติมก่อนที่คำสั่งจะถูกส่งไปยังล่ามหรือคอมไพเลอร์ก่อนที่จะดำเนินการและนักออกแบบรุ่นแรกไม่ได้เตรียมที่จะสิ้นเปลืองพลังงานของคอมพิวเตอร์เพื่อความสะดวก

ฉันเชื่อว่ามีจำนวนการยืนยันที่ไม่ถูกต้องในความคิดเห็นที่ทำไว้ข้างต้น ประการแรกนักจิตวิทยาจะบอกคุณว่ามนุษย์ไม่เลือกปฏิบัติโดยอัตโนมัติระหว่างคำที่เขียนด้วยตัวอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กหรือแม้แต่การรวมกันของทั้งสองในแง่ของความหมายของคำ เคสถูกใช้ในภาษาที่แสดงออกปกติเพื่อสื่อความหมายเพิ่มเติม ตัวอย่างเช่นการใช้อักษรตัวใหญ่เริ่มต้นคำในประโยคแสดงว่ามันเป็นคำนามที่เหมาะสมที่สุด ตัวอักษรพิมพ์ใหญ่ใช้เพื่อให้โครงสร้างร้อยแก้ว ตัวอย่างเช่นตัวพิมพ์ใหญ่ใช้เพื่อระบุจุดเริ่มต้นของประโยค แต่จิตใจมนุษย์มองว่า "คำ" และ "คำว่า" มีความหมายเหมือนกัน

ผู้สร้างของ DOS และของ ADA และ Pascal เพื่อชื่อไม่กี่ชื่นชมว่ากรณีความไวเป็นภาระเพิ่มเติมในการเริ่มต้น ในภายหลังผู้แก้ไขข้อความใน "การพัฒนาแบบบูรณาการสภาพแวดล้อม" (IDEs) จำคำสำรองสามารถแต่งใหม่คำนั้นว่ามันสอดคล้องกับสไตล์อย่างไรก็ตาม บวกแสดงมันในสีที่แตกต่างเพื่อให้คำที่โดดเด่น ดังนั้นการโต้แย้งว่า case sensitive ทำให้โค้ดที่อ่านได้มากขึ้นนั้นผิดพลาด ไม่ใช่สำหรับคน "ธรรมดา" มันเพิ่มเลเยอร์ที่ไม่จำเป็นและบางครั้งสร้างความสับสนให้กับงานที่มีความต้องการอยู่แล้ว

Java เป็นตัวอย่างที่ยอดเยี่ยมของภาษาที่แย่มากจากมุมมองที่ใช้งานง่ายโดยผู้เริ่มต้น มันบังคับใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่อย่างเข้มงวด แต่อย่างโง่เขลาจะอนุญาตให้โปรแกรมเมอร์มีสองฟังก์ชั่นทั้งสองที่มีชื่อเหมือนกัน แต่ที่จริงแล้วฟังก์ชั่นที่แตกต่างกัน แท้จริงแล้ว Java เป็นเช่นการทำแท้งของภาษาที่เมื่อมหาวิทยาลัยย้ายจากการสอนไวยากรณ์ Pascal ไปยังนักเรียนการเรียนหลักสูตรที่ไม่ใช่วิทยาศาสตร์คอมพิวเตอร์อัตราการส่งผ่านลดลงจากประมาณ 70% เป็น 40%

โดยสรุปแล้วความไวตัวพิมพ์เล็กและใหญ่มาจากสองสาเหตุ หนึ่งคือการขาดพลังงานคอมพิวเตอร์ อย่างที่สองก็คือคนที่หาทางเข้าสู่วิทยาการคอมพิวเตอร์มักจะอยู่ในสเปกตรัมออทิสติกและไม่เกี่ยวข้องกับความต้องการของคน "ปกติ" ด้วยเหตุนี้คนเหล่านี้จึงไม่สามารถชื่นชมได้ว่าความไวของกรณีนั้นไม่จำเป็นและเป็นอุปสรรคต่อการเรียนรู้และการใช้ภาษาการเขียนโปรแกรม


1
ฉันจะลบส่วนบน Java เพราะมันเป็น imho ตามความเห็นและนอกเหนือจากจุด (วิธีการมากไปมีน้อยจะทำอย่างไรกับ case-sensitive) ... วิธี / ฟังก์ชั่นการทำงานมากเกินไปพบในภาษาอื่นเช่น C ++ และ PL / sql เพื่อชื่อ แต่สอง สำหรับย่อหน้าจิตวิทยาของคุณฉันคิดว่าแหล่งข้อมูลน่าจะดี ... ในที่สุดย่อหน้าสุดท้ายคือ imho ตามความคิดเห็นเป็นที่น่ารังเกียจและควรถูกลบออก
thecarpy

เพื่อให้คุณเข้าใจได้ดียิ่งขึ้นว่าทำไม C และภาษาทั้งหมดที่เกิดจากภาษานั้นได้สร้างความเสียหายต่อสาเหตุของวิทยาการคอมพิวเตอร์โปรดไปที่; linkedin.com/pulse/ …แก่นแท้ของปัญหานี้หรือฉันควรจะบอกว่าเคอร์เนล :-) คือโปรแกรมเมอร์นั้นเป็นคนประเภทบุคลิกภาพที่ไม่เกี่ยวข้องกับการแพร่กระจายความรู้ แต่เป็นการทำงานให้เสร็จ หากคุณไม่เห็นด้วยกับสิ่งที่ถูกกล่าวถึงในโพสต์นี้กรุณายื่นข้อโต้แย้งเพื่อยืนยันตำแหน่งของคุณ ความเห็นนับว่าน้อย
Kevin Loughrey

ฉันยอมรับว่ากรณีความไวทำให้การเรียนรู้ยากขึ้น แต่โปรดทราบว่าเกือบทุกอย่างในระบบยูนิกซ์เป็นตัวพิมพ์เล็กดังนั้นจึงควรทำเช่นนั้น ข้อยกเว้นที่สำคัญคือตัวแปรสภาพแวดล้อมเป็นเมืองหลวงทั้งหมด
ctrl-alt-delor

ควรใช้เคสอย่างสม่ำเสมอและดังที่ได้กล่าวไว้ในคำตอบนี้เพื่อสื่อข้อมูลเพิ่มเติมเช่นตัวแปรสภาพแวดล้อมกับตัวแปรเชลล์ปกติ
ctrl-alt-delor

-3

การคำนึงถึงขนาดตัวพิมพ์เป็นความคิดที่โง่ ๆ ที่เกิดขึ้นเพราะนักเขียน Unix ไม่เข้าใจว่า ASCII ถูกออกแบบมาให้คำนึงถึงขนาดตัวพิมพ์ หนึ่งเพียงละเว้นบิตนำ Ascii เป็นการเข้ารหัส 7 บิตที่มีตัวพิมพ์ใหญ่ A ที่ค่าทศนิยม 65 1000001 และที่ทศนิยม 97 9700000000 ตัวอักษรที่ตามมาตัวอักษร สิ่งนี้สร้างความคิดทุกประเภทเช่นคีย์ทั้งหมดในคู่ของค่าคีย์ควรเป็นตัวเลขเพื่อหลีกเลี่ยงการใส่รองเท้าแตะแตกต่างจากรองเท้าแตะ เลือกฐานข้อมูลหลายค่าที่รับรู้สิ่งนี้ตั้งแต่เริ่มต้นและไม่คำนึงถึงขนาดตัวพิมพ์


2
"Silly" เป็นความคิดเห็นของคุณ คำตอบนี้มีความจริงน้อยมากที่ฉันเห็น โอ้และทำไมจึง จำกัด ตัวเองไว้ที่ ASCII มี EBCDIC ด้วยเช่นกัน
roaima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.