ใครเกี่ยวข้องกับดาว * ในเสียงสะท้อน *


15

ใครเป็นคนจัดการ (ตีความ) * ใน

echo *

เสียงสะท้อนจะเห็นดาวหรือเปลือกหอยดูแลและส่งคืนรายการชื่อไฟล์ ..

เกี่ยวกับอะไร

cp temp temp*

14
มันแตกต่างกันไป Unix shells หรือ Windows shells?
user1686

@grawity Unix shells ขอโทษฉันไม่ได้พูดถึงเรื่องนั้น
faressoft

สำหรับ Unix คำตอบด้านล่างนี้ถูกต้อง (ใน Windows จะทำโดยแต่ละโปรแกรม - โดยปกติแล้วจะเป็นโดยอัตโนมัติโดยไลบรารีรันไทม์ก่อน main ())
user1686

คำตอบ:


24

ทุบตี (หรือสิ่งที่คุณใช้เป็นเปลือก) เป็นสิ่งแรกที่จะอ่านป้อนข้อมูลใด ๆ และจะเริ่มต้นการตีความตัวอักษรพิเศษเช่นและ? ได้รับการขยายไปยังสิ่งที่ตรงกันในCWDซึ่งหมายความว่าเครื่องหมายดอกจันจะถูกแทนที่ด้วยการแข่งขันดังกล่าว**

ในกรณีส่วนใหญ่สิ่งนี้จะเกิดขึ้นต่อเนื่องกันไปข้างหน้า แต่อาจทำให้บางกรณีเกิดความสับสนได้เป็นครั้งคราว

พิจารณาดังต่อไปนี้ ไดเรกทอรีมีเนื้อหานี้:

  • ทดสอบ (ไฟล์ปกติ)
  • test1 (ไดเรกทอรี)
  • test2 (ไดเรกทอรี)
  • test3 (ไดเรกทอรี)

หากคุณพิมพ์mv *สิ่งที่ดูเหมือนว่าแปลกเกิดขึ้น: test3มี แต่ส่วนที่เหลือจะหายไป mvในขณะที่แปลกในตอนแรกมันทำให้รู้สึกเมื่อคุณเข้าใจสิ่งที่ทุบตีจริงผ่านไป เนื่องจากเครื่องหมายดอกจัน bash ตีความmv *ว่าmv test test1 test2 test3และเมื่อ mv ได้รับรายการนั้นจะถือว่าการโต้แย้งครั้งสุดท้ายคือปลายทางซึ่งเป็นที่ที่ไฟล์ทั้งหมดจะถูกย้าย

สำหรับคำสั่งที่คุณระบุไว้:

  • echo *สามารถทำหน้าที่เป็นคนจนlsได้ เชลล์จะขยายเครื่องหมายดอกจันไปยังสิ่งที่อยู่ในไดเรกทอรีนั้นและตามที่ฉันแน่ใจว่าคุณรู้อยู่แล้วว่าechoจะสะท้อนสิ่งที่ทุบตีส่งผ่านไปยังการโต้แย้ง
  • cp temp temp*จะทำตัวคล้ายกับmvคำสั่งที่ฉันได้อธิบายไว้ข้างต้นเว้นแต่จะมีเพียงไดเรกทอรีเดียวชื่อ temp ซึ่งในกรณีนี้ชื่อต้นทางและปลายทางจะเหมือนกันนั่นคือมันจะไม่ทำอะไรเลย

8
ไม่มีอะไรที่ "น่าสงสาร" เป็นเรื่องเกี่ยวกับการใช้แทน* lsตัวอย่างเช่นfor f in *; doมีความน่าเชื่อถือมากกว่าfor f in $(ls)ถ้าชื่อไฟล์มีช่องว่างหรืออักขระกลม (อย่างไรก็ตามจะล้มเหลวหากไม่มีไฟล์ใน CWD ดังนั้นคุณจำเป็นต้องตรวจสอบกรณีดังกล่าว)
rici

1
@rici นั่นคือสิ่งที่shopt nullglobมีไว้เพื่อ
CVN

3
สำหรับecho *เคล็ดลับนั้นสามารถช่วยคุณได้ในบางกรณี
CVN

2
การรวมกับ: ไฟล์ที่เติมด้วย "-" ในโฟลเดอร์ที่กำหนดเองซึ่งทำให้เกิดสวิตช์ที่ไม่พึงประสงค์ การลบออกจะไม่สนุกจนกว่าคุณจะรู้ว่า rm ./-stupidfile ทำงานได้
ρɯͽbρɯͽ

1
@ ǝɲǝɲbρɯͽฉันสังเกตเห็นเมื่อฉันต้องการลบเนื้อหาของไดเรกทอรีที่มีไฟล์พร้อมชื่อไฟล์ที่แสดงตำแหน่งในระบบพิกัดจาก -1024x-1024 ถึง 1024x1024 นั่นเป็นครั้งแรกที่ฉันได้เรียนรู้เกี่ยวกับการหลบหนี
Jarmund

5

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

ในทำนองเดียวกันcp /tmp/temp temp*จะสร้างไฟล์ชื่อในไดเรกทอรีปัจจุบันถ้ามีไม่ได้อย่างน้อยหนึ่งไฟล์ที่ชื่อขึ้นต้นด้วยtemp*temp

สุดท้ายหากคุณต้องการ*ที่จะผ่านการเปลี่ยนแปลงไม่ว่ากรณีที่คุณสามารถป้องกันได้จากการขยายตัวโดยใช้ราคาเดียว'*', คำพูดคู่หรือทับขวา"*"\*


4

ใน 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 ซึ่งเป็นรายแรกในรายชื่อไดเรกทอรีมันอันตรายเพราะสิ่งใด ๆ หลังจากนั้นจะถูกลบ นอกจากนี้และไม่น่าเป็นไปได้น้อยหากไฟล์แรกในรายชื่อไดเรกทอรีเป็นชื่อของสคริปต์ในพา ธ ไฟล์นั้นจะทำงาน


4
หมายเหตุอาจมีชื่อไฟล์rmแน่นอน
Volker Siegel

1
... และอีกอันเรียกว่า -rf
ǝɲǝɲbρɯͽ

1
@ ǝɲǝɲbρɯͽคุณมีไฟล์ชื่อไฟล์ได้-rfไหม? ฉันลองtouch -rfแล้วtouch \-rfแต่มันไม่ได้สร้าง
barlop

@barlop ฉันแสดงความคิดเห็นข้างต้น gui (เช่น gedit) จัดการกับมันได้ดี แต่เนื่องจาก shell (อย่างน้อย bash) ส่งผ่านสิ่งนี้ผ่านมันต้องการ. / in front หากคุณตั้งใจสร้างไฟล์ดังกล่าวโดยไม่ได้ตั้งใจลองใช้คำใบ้ แต่ถ้าไม่: ฉันหวังว่าไฟล์นี้จะจบลงในโฟลเดอร์ชั่วคราวที่มีไฟล์ย่อย ๆ
ρɯͽbρɯͽ

@ ǝɲǝɲbρɯͽฉันไม่เข้าใจความหมายของคุณเลยฉันกำลังถามว่าคุณจะสร้างไฟล์ที่ชื่อได้-rfอย่างไร? (ผมเข้าใจอันตรายของไฟล์ที่เรียกว่า RM และไฟล์ที่เรียกว่า -rf และปัญหาในการพิมพ์ * และผลักดันใส่ในโฟลเดอร์ที่สำคัญผมไม่ได้วางแผนที่จะทำอย่างนั้น)
barlop

-1

เชลล์ทำการขยายหลายครั้ง ก่อนส่งอาร์กิวเมนต์ไปยังคำสั่ง

ดูเพิ่มเติมที่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


ในทางเทคนิคสิ่งที่คุณเขียนนั้นถูกต้อง แต่ถ้าไม่มีลิงก์คำตอบนี้จะไม่ทำอะไรเลยเพื่อตอบคำถาม พิจารณาผสมผสานรายละเอียดที่เกี่ยวข้อง
CVN

@ MichaelKjörlingฉันเห็นด้วยกับสิ่งที่เกี่ยวกับการเชื่อมโยง แต่ OP ก็ถามว่าเปลือกหรือคำสั่งตัวเองจัดการข้อโต้แย้ง คำตอบของ Glenn ระบุว่าเชลล์จัดการกับมันดังนั้นจึงเป็นคำตอบที่ยอมรับได้สำหรับคำถาม
slhck

@slhck ซึ่งเป็นสาเหตุที่ฉันไม่ได้ตั้งค่าสถานะเป็น NAA: มีบางสิ่งเหลืออยู่ที่ตอบคำถามหลังจากลอกลิงก์ ไม่ได้หมายความว่านี่เป็นคำตอบที่ดีในความคิดของฉัน (ตอนนี้ฉันเห็นว่าความคิดเห็นเริ่มต้นของฉันอาจถูกตีความเป็นอย่างอื่นสำหรับเรื่องนั้นฉันขอโทษ แต่ฉันก็ยังคิดว่ามันมีค่าพอที่จะทิ้งไว้ในที่ที่มันอยู่)
CVn

@ MichaelKjörlingเห็นด้วย ฉันเพิ่งออกความคิดเห็นสำหรับผู้ที่ทำ (และจะ) ตั้งค่าสถานะเป็น NAA
slhck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.