ใครเป็นคนจัดการ (ตีความ) * ใน
echo *
เสียงสะท้อนจะเห็นดาวหรือเปลือกหอยดูแลและส่งคืนรายการชื่อไฟล์ ..
เกี่ยวกับอะไร
cp temp temp*
ใครเป็นคนจัดการ (ตีความ) * ใน
echo *
เสียงสะท้อนจะเห็นดาวหรือเปลือกหอยดูแลและส่งคืนรายการชื่อไฟล์ ..
เกี่ยวกับอะไร
cp temp temp*
คำตอบ:
ทุบตี (หรือสิ่งที่คุณใช้เป็นเปลือก) เป็นสิ่งแรกที่จะอ่านป้อนข้อมูลใด ๆ และจะเริ่มต้นการตีความตัวอักษรพิเศษเช่นและ?
ได้รับการขยายไปยังสิ่งที่ตรงกันในCWDซึ่งหมายความว่าเครื่องหมายดอกจันจะถูกแทนที่ด้วยการแข่งขันดังกล่าว*
*
ในกรณีส่วนใหญ่สิ่งนี้จะเกิดขึ้นต่อเนื่องกันไปข้างหน้า แต่อาจทำให้บางกรณีเกิดความสับสนได้เป็นครั้งคราว
พิจารณาดังต่อไปนี้ ไดเรกทอรีมีเนื้อหานี้:
หากคุณพิมพ์mv *
สิ่งที่ดูเหมือนว่าแปลกเกิดขึ้น: test3
มี แต่ส่วนที่เหลือจะหายไป mv
ในขณะที่แปลกในตอนแรกมันทำให้รู้สึกเมื่อคุณเข้าใจสิ่งที่ทุบตีจริงผ่านไป เนื่องจากเครื่องหมายดอกจัน bash ตีความmv *
ว่าmv test test1 test2 test3
และเมื่อ mv ได้รับรายการนั้นจะถือว่าการโต้แย้งครั้งสุดท้ายคือปลายทางซึ่งเป็นที่ที่ไฟล์ทั้งหมดจะถูกย้าย
สำหรับคำสั่งที่คุณระบุไว้:
echo *
สามารถทำหน้าที่เป็นคนจนls
ได้ เชลล์จะขยายเครื่องหมายดอกจันไปยังสิ่งที่อยู่ในไดเรกทอรีนั้นและตามที่ฉันแน่ใจว่าคุณรู้อยู่แล้วว่าecho
จะสะท้อนสิ่งที่ทุบตีส่งผ่านไปยังการโต้แย้งcp temp temp*
จะทำตัวคล้ายกับmv
คำสั่งที่ฉันได้อธิบายไว้ข้างต้นเว้นแต่จะมีเพียงไดเรกทอรีเดียวชื่อ temp ซึ่งในกรณีนี้ชื่อต้นทางและปลายทางจะเหมือนกันนั่นคือมันจะไม่ทำอะไรเลย*
ls
ตัวอย่างเช่นfor f in *; do
มีความน่าเชื่อถือมากกว่าfor f in $(ls)
ถ้าชื่อไฟล์มีช่องว่างหรืออักขระกลม (อย่างไรก็ตามจะล้มเหลวหากไม่มีไฟล์ใน CWD ดังนั้นคุณจำเป็นต้องตรวจสอบกรณีดังกล่าว)
shopt nullglob
มีไว้เพื่อ
echo *
เคล็ดลับนั้นสามารถช่วยคุณได้ในบางกรณี
ตามที่ระบุไว้แล้วเชลล์จะขยาย*
เพื่อecho
รับเป็นอาร์กิวเมนต์ที่เชลล์พบในไดเรกทอรีปัจจุบัน อย่างไรก็ตามทราบว่าถ้านำไปสู่การขยายตัวเพื่ออะไรเช่นในกรณีที่ว่าถ้าไดเรกทอรีไม่มีไฟล์ที่ไม่ซ่อนที่*
เหลืออยู่ไม่เปลี่ยนแปลงและผ่านการเป็นคำสั่งที่เรียกว่า (ยกเว้นกรณีที่ตัวเลือกไม่ได้มาตรฐานจะใช้กับเปลือกหอยบางอย่างเช่นbash
.) echo *
ไม่ได้แล้วจะไปทำตัวเหมือนคนจนเป็นอดีตจะพิมพ์อะไรในขณะที่หลังจะพิมพ์ls
*
ในทำนองเดียวกันcp /tmp/temp temp*
จะสร้างไฟล์ชื่อในไดเรกทอรีปัจจุบันถ้ามีไม่ได้อย่างน้อยหนึ่งไฟล์ที่ชื่อขึ้นต้นด้วยtemp*
temp
สุดท้ายหากคุณต้องการ*
ที่จะผ่านการเปลี่ยนแปลงไม่ว่ากรณีที่คุณสามารถป้องกันได้จากการขยายตัวโดยใช้ราคาเดียว'*'
, คำพูดคู่หรือทับขวา"*"
\*
ใน Bash เชลล์เกี่ยวข้องกับมัน คุณเห็นว่าถ้าคุณลอง*
โดยไม่ต้องก้อง
หมายเหตุ - จากความคิดเห็นบางอย่างฉันขอแนะนำเมื่อเรียกใช้ * ENTER เพื่อสร้างไดเรกทอรีและใช้คำสั่ง touch เพื่อสร้างไฟล์บางไฟล์และตรวจสอบให้แน่ใจว่าไม่มีไฟล์ใดหรืออย่างน้อยต้องแน่ใจว่าไฟล์แรกเรียงตามตัวอักษรไม่ใช่ชื่อ ของสคริปต์หรือคำสั่งใด ๆ ในเส้นทาง
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
ดังนั้นls *
เป็นบิตของถ้อยคำที่เบื่อหู
ใน Windows *
ถูกจัดการโดยคำสั่งดังนั้นdir *.*
ไม่ใช่ถ้อยคำที่เบื่อหู
หมายเหตุ - เมื่อเห็นความคิดเห็นฉันจะเพิ่มมีความเสี่ยงในการใช้งาน * จากนั้นกด ENTER หากคุณมีไฟล์ชื่อ rm ซึ่งเป็นรายแรกในรายชื่อไดเรกทอรีมันอันตรายเพราะสิ่งใด ๆ หลังจากนั้นจะถูกลบ นอกจากนี้และไม่น่าเป็นไปได้น้อยหากไฟล์แรกในรายชื่อไดเรกทอรีเป็นชื่อของสคริปต์ในพา ธ ไฟล์นั้นจะทำงาน
rm
แน่นอน
-rf
ไหม? ฉันลองtouch -rf
แล้วtouch \-rf
แต่มันไม่ได้สร้าง
-rf
อย่างไร? (ผมเข้าใจอันตรายของไฟล์ที่เรียกว่า RM และไฟล์ที่เรียกว่า -rf และปัญหาในการพิมพ์ * และผลักดันใส่ในโฟลเดอร์ที่สำคัญผมไม่ได้วางแผนที่จะทำอย่างนั้น)
เชลล์ทำการขยายหลายครั้ง ก่อนส่งอาร์กิวเมนต์ไปยังคำสั่ง
ดูเพิ่มเติมที่https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
ไม่ใช่เฉพาะทุบตีดูhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01