~$ 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
) ทำในเครื่องหมายคำพูดคู่ แต่ไม่ใช่เครื่องหมายคำพูดเดี่ยว