~$ 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
เหตุใดคำสั่งย่อยที่สองจึงล้มเหลว
~$ 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
เหตุใดคำสั่งย่อยที่สองจึงล้มเหลว
คำตอบ:
ลบเครื่องหมายคำพูดรอบ ๆ*.txtและควรจะได้ผล *.txtด้วยคำพูดที่เปลือกจะมองหาชื่อไฟล์ตัวอักษร หากต้องการสำรวจ / ทดลองให้ลองสร้างไฟล์ที่มีชื่อ*.txtเป็นtouch '*.txt'และทำซ้ำคำสั่ง
ในแบบเดียวกับที่คุณไม่สามารถรันls "*.txt"ในเชลล์ปกติคุณไม่สามารถรันมันในเชลล์ย่อยได้ เมื่อคุณใส่*.txtเครื่องหมายคำพูดคุณlsค้นหาไฟล์ตามตัวอักษรที่ถูกเรียก*.txtเมื่อคุณควรทำสิ่งนี้แทน:
$ echo $(ls *.txt) # => file.txt otherfile.txt
วิธีที่ดีกว่าในการทำเช่นนี้คือไม่ควรใช้งานlsเลย
$ echo *.txt # => file.txt otherfile.txt
lsสำหรับการลบซ้ำซ้อน
ls -l "*.txt"ได้ หรืออย่างน้อยฉันก็สามารถ ฉันทำมันไม่บ่อยนัก แต่เมื่อฉันทำมันมักจะบอกฉันว่าไม่สามารถหา * .txt ...
bashและเชลล์ที่คล้ายกันzsh) ไม่เหมือนกับคำพูดเดี่ยว! ตัวอย่างเช่นการขยายพารามิเตอร์ ($foo) ทำในเครื่องหมายคำพูดคู่ แต่ไม่ใช่เครื่องหมายคำพูดเดี่ยว