ทำไมฉันจึงทำ ls * .txt ไม่ได้ในชั้นย่อย


13
~$ echo $(ls)  
arguments.txt cecho.sh Desktop Documents Downloads example.txt Music Pictures Public     
~$ echo $(ls "*.txt")  
ls: cannot access *.txt: No such file or directory  

เหตุใดคำสั่งย่อยที่สองจึงล้มเหลว

คำตอบ:


27

ลบเครื่องหมายคำพูดรอบ ๆ*.txtและควรจะได้ผล *.txtด้วยคำพูดที่เปลือกจะมองหาชื่อไฟล์ตัวอักษร หากต้องการสำรวจ / ทดลองให้ลองสร้างไฟล์ที่มีชื่อ*.txtเป็นtouch '*.txt'และทำซ้ำคำสั่ง


6
โปรดทราบว่าเครื่องหมายคำพูดคู่ (อย่างน้อยในbashและเชลล์ที่คล้ายกันzsh) ไม่เหมือนกับคำพูดเดี่ยว! ตัวอย่างเช่นการขยายพารามิเตอร์ ( $foo) ทำในเครื่องหมายคำพูดคู่ แต่ไม่ใช่เครื่องหมายคำพูดเดี่ยว
แบล็กไลท์ส่องแสง

30

ในแบบเดียวกับที่คุณไม่สามารถรันls "*.txt"ในเชลล์ปกติคุณไม่สามารถรันมันในเชลล์ย่อยได้ เมื่อคุณใส่*.txtเครื่องหมายคำพูดคุณlsค้นหาไฟล์ตามตัวอักษรที่ถูกเรียก*.txtเมื่อคุณควรทำสิ่งนี้แทน:

$ echo $(ls *.txt) # => file.txt otherfile.txt

วิธีที่ดีกว่าในการทำเช่นนี้คือไม่ควรใช้งานlsเลย

$ echo *.txt # => file.txt otherfile.txt

7
+1 lsสำหรับการลบซ้ำซ้อน
แบล็กไลท์ส่องแสง

3
Nitpicking: คุณสามารถวิ่งls -l "*.txt"ได้ หรืออย่างน้อยฉันก็สามารถ ฉันทำมันไม่บ่อยนัก แต่เมื่อฉันทำมันมักจะบอกฉันว่าไม่สามารถหา * .txt ...
Ingo

@lngo: นั่นอยู่ในโพสต์ของ OP ด้วย
ไบรอัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.