คุณสมบัติของเปลือกเป็นแบบกลมหรือไม่?


12

ฉันอ่านคำถามและคำตอบมากมายเช่นนี้และคำถามนี้

ฉันรู้ว่า wildcards นั้นถูกขยายโดยเชลล์ก่อนที่จะรันคำสั่งและมันเป็นคุณสมบัติของเชลล์ อักขระตัวแทนยังทำงานกับคำสั่งเหล่านั้นที่สามารถยอมรับอาร์กิวเมนต์ได้มากมาย ในfind . -name *.rb ถ้าเรามีมากกว่าหนึ่งไฟล์ในไดเรกทอรีปัจจุบันfindจะทำให้เรามีข้อผิดพลาดเพราะการค้นหาไม่สามารถยอมรับข้อโต้แย้งหลาย ๆ และวิธีการแก้ปัญหานี้คือ:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

เราหนีเครื่องหมายดอกจันและป้องกันการขยายโดยเชลล์ แต่อักขระตัวแทนเป็นคุณลักษณะของเชลล์ เมื่อเราหลบหนีเชลล์ดอกจันไม่ทราบความหมายของมันและควรหาไฟล์ชื่อ*.rbดังนั้นเครื่องหมายดอกจันจะถูกขยายในกรณีนี้อย่างไร

คำตอบ:


21

ใช่เชลล์เข้าใจ*ว่าเป็นไฟล์ทั้งหมดที่มีอักขระใด ๆ ในไดเรกทอรีและ*.rbเช่นเดียวกับไฟล์ทั้งหมดที่มีอักขระใด ๆ และลงท้ายด้วย.rbและจะขยายออกเป็นเช่นนั้น

findคำสั่งตัวเองยอมรับ globbing

หากคุณไม่ได้อ้างอิงเครื่องหมายคำสั่ง*เชลล์จะขยายออกก่อนที่findคำสั่งจะเห็นอาร์กิวเมนต์ของมันดังนั้นแทนที่จะ*.rbส่งglob ไปfindที่ชื่อของไฟล์ทั้งหมดที่ตรงกับ glob ในไดเรกทอรีจะถูกส่งไปยังfindและfindจะพยายามตีความมัน เป็นอาร์กิวเมนต์ซึ่งอาจส่งผลให้เกิดข้อผิดพลาดหรืออย่างน้อยไม่ใช่สิ่งที่คุณต้องการ (มันจะทำงานได้อย่างถูกต้องเฉพาะในกรณีที่ไม่มีไฟล์ที่ตรงกันในไดเรกทอรีปัจจุบัน)


ขอบคุณมันหมายความว่าเราพูดกับเชลล์ว่ามันไม่ใช่ glob แต่บางคำสั่งสามารถขยายสัญลักษณ์แทนได้? หรือเราสามารถพูดได้ว่าถ้าเรามีเชลล์โดยไม่เข้าใจเกี่ยวกับการทำให้กลมเป็นคำสั่งเหล่านั้นรู้เกี่ยวกับการทำให้กลมสามารถขยายได้
Sinoosh

5
ถ้า*มีการอ้างถึงแล้วเชลล์จะไม่ขยายและอาร์กิวเมนต์รวมถึง glob นั้นถูกส่งผ่านไปยังคำสั่งที่สามารถเข้าใจ glob - มันเหมือนกันสำหรับคำสั่งใด ๆ ที่ยอมรับ regex ซึ่งควรจะยกมา ...
Zanna

1
ความสุขของฉัน ^ _ ^
Zanna

7
@Sinoosh: โปรดทราบว่าคำสั่งบางคำอาจไม่เข้าใจไวยากรณ์ของ glob มันเพิ่งจะกลายเป็นคุณสมบัติของfind
slebetman

1
@Sinoosh Find ไม่ได้ "ขยาย" สัญลักษณ์แทนจริง ๆ ใช้เพื่อทดสอบเพื่อให้ตรงกับชื่อไฟล์แต่ละชื่อที่พบ มีคำสั่ง (มาก) น้อยที่ขยาย wildcards ในความหมายทั่วไป - unzip และ 7z สามารถใช้เพื่อเปิดไฟล์เก็บถาวรหลายไฟล์ (เมื่ออาร์กิวเมนต์ของพวกเขาเป็นแบบฟอร์ม " [archive filename single argument] [list of files to extract]")
สุ่ม 832
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.