cat ให้ข้อผิดพลาดที่แตกต่างกันเมื่อเปิดไฟล์ที่ไม่มีอยู่


22

คำสั่งทั้งสองต่อไปนี้พยายามเปิดไฟล์ที่ไม่มีอยู่fooแต่ข้อความแสดงข้อผิดพลาดแตกต่างกันเล็กน้อย อะไรคือเหตุผล?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory

12
คนโปรดอย่าโพสต์ลงคะแนนเท่านั้นตามการจัดรูปแบบโดยเฉพาะอย่างยิ่งสำหรับโพสต์ที่มาจากผู้มาใหม่ นี่เป็นคำถามที่ถูกต้องมาก
Stéphane Chazelas

21
มันควรจะเป็นcat < foodแทนcat < foo
Tulains Córdova

6
@ TulainsCórdovaหรือในบางวัฒนธรรม, food < cat)
ตกต่ำ


1
catเพียงข้อผิดพลาดแรกมาจาก ตอนนี้ฉันสงสัยว่าข้อความที่สองมาจากไหนโดยเริ่มจากbash:...
Dmitry Grigoryev

คำตอบ:


30
cat foo

นี้รันคำสั่งที่มีการโต้แย้งcat fooข้อผิดพลาดที่พิมพ์บนหน้าจอขึ้นอยู่กับสิ่งที่ตัดสินใจโดยโปรแกรมเมอร์ของคำสั่ง

cat < foo 

นี้ฟีดเนื้อหาของแฟ้มfooไปที่catคำสั่งโดยใช้การเปลี่ยนเส้นทางทุบตี stdin หากไฟล์ไม่มีอยู่แสดงว่าเป็น Bash ที่บ่นเกี่ยวกับไฟล์


20

ใน$ cat fooเปลือก (ที่นี่ทุบตี) รันคำสั่งและส่งผ่านพารามิเตอร์cat fooโปรแกรม cat เลือกที่จะตีความพารามิเตอร์นั้นเป็นชื่อไฟล์ - และพยายามเปิดไฟล์ ข้อผิดพลาดที่คุณเห็นมาจากโปรแกรม cat ซึ่ง (โดยธรรมชาติ) ไม่สามารถเปิดไฟล์ได้

รุ่น$ cat < fooนี้คือการเปลี่ยนเส้นทางซึ่งจัดการโดยเชลล์ <เป็นตัวดำเนินการเชลล์ที่สั่งให้เชลล์เปิดไฟล์และเปลี่ยนเส้นทางไปยัง stdin ไฟล์ไม่มีอยู่เพื่อให้คุณได้รับ "ไม่มีไฟล์ดังกล่าว" เวลานี้ข้อผิดพลาดมาจากเชลล์ (ทุบตี) และดูแตกต่างกันเล็กน้อย

นี่คือสาเหตุที่คุณเห็นข้อผิดพลาด 2 แบบ สาเหตุเหมือนกัน - แต่มาจาก 2 โปรแกรมที่แตกต่างกัน (cat และ bash)


18
เลขที่ในcat < foo, catไม่ได้เรียกถ้าเปลี่ยนเส้นทางล้มเหลว (และมีข้อความแสดงข้อผิดพลาดที่สอดคล้องกัน) เป็นสาเหตุหนึ่งที่ทำให้การเปลี่ยนเส้นทางดีกว่าหากเป็นไปได้ นอกจากนี้ยังพิจารณาcat < in > outเทียบกับcat in > outที่อดีตป้องกันoutการถูกแทนที่ถ้าinไม่ได้อยู่ (เปลือกยกเลิกคำสั่งทันทีหลังจากที่ล้มเหลวใน< inการเปลี่ยนเส้นทางและไม่ได้ทำต่อไป> outการเปลี่ยนเส้นทางให้อยู่คนเดียววิงวอนขอcat)
Stéphane Chazelas

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