เหตุใดเชลล์ในตัวของเชลล์จึงไม่สามารถทำงานด้วยตัวพิมพ์ใหญ่ แต่คำสั่งอื่นสามารถทำได้


33

ทำไมนี้

เมื่อฉันทำเช่นนี้

CD ~/Desktop

ไม่ได้พาฉันไปที่เดสก์ท็อป แต่นี่:

echo "foo
bar" | GREP bar

ให้ฉัน:

bar

4
ตรวจสอบว่าalias GREPหรือwhich GREPส่งออกอะไร
chepner

1
ไปแล้ว คุณมีคำสั่งที่มีชื่อซึ่งแตกต่างจากGREP grep(จริงมันอาจเป็นเพียงการเชื่อมโยงอย่างหนักหรือการเชื่อมโยงสัญลักษณ์/usr/bin/grepแต่จากจุดยืนของเชลล์มันเป็นคำสั่งที่แยกต่างหาก.)
chepner

12
รอ: คุณอยู่ใน Mac OS X ใช่ไหม HFS + คือการสงวนตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ซึ่งหมายความว่าหากกรณีสำคัญเมื่อคุณสร้างไฟล์ แต่เมื่อไฟล์มีอยู่การค้นหาจะคำนึงถึงขนาดตัวพิมพ์ นั่นคือbashอาจขอชื่อไฟล์GREPแต่ระบบไฟล์พิจารณาว่าgrepตรงกัน
chepner

1
ใช่เพราะมันคือยูนิกซ์
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ปฏิบัติการ

Shell builtins ไม่ได้ค้นหาในระบบไฟล์: เนื่องจากมีการสร้างอยู่ภายในจึงสามารถเข้าถึงได้ผ่านการเปรียบเทียบสตริง (คำนึงถึงตัวอักษร) ในเชลล์

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

คุณสามารถลองสิ่งเหล่านี้ด้วยtypebuiltin :

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

typeบอกคุณว่าเชลล์จะทำอย่างไรเมื่อคุณเรียกใช้คำสั่งนั้น เมื่อคุณเรียกใช้cdคุณเข้าถึง builtin แต่CDพบว่าปฏิบัติการ สำหรับ builtins อื่น ๆ builtin และ executable จะเข้ากันได้อย่างสมเหตุสมผล (ลองecho) แต่cdก็เป็นไปไม่ได้


1
คำตอบที่ดี. ฉันกำลังจะพูด cygwin ซึ่งจะมีผลเช่นเดียวกัน
Joshua

@ โจชัวปัญหาของ OP ได้รับการแก้ไข แต่ฉันคิดว่าสำหรับผู้อ่านเพิ่มเติมเกี่ยวกับคำถามคำตอบจาก cygwin จะมีประโยชน์อย่างน้อยที่สุดเท่าที่มีอยู่ บางทีคุณอาจทำให้คำถามนี้เป็นคำตอบที่แยกจากกันได้แม้ว่าจะสั้นและชะลอไปที่รายละเอียดที่มีอยู่
Volker Siegel

1
เหตุใด posix จึงต้องการคำสั่งที่ไม่มีประโยชน์เช่น cd และทำไมซีดีภายในของ osx จึงไม่มีคุณสมบัติ
จอห์น

2
51 upvotes! ฉันควรจะได้โพสต์เพียงคำตอบแทนการแสดงความคิดเห็น :)
chepner

1
/ usr / bin / cd มีวัตถุประสงค์ ไวยากรณ์คืออาร์กิวเมนต์ของโปรแกรมไดเร็กทอรีของไดเร็กตอรี่ / usr / bin / cd
Joshua
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.