ต้องใช้อักขระใดบ้างในไฟล์ที่ไม่มีเครื่องหมายคำพูด?


12

ฉันมีเชลล์ / เทอร์มินัลที่ใช้รันคำสั่ง bash และฉันกำลังหลบหนีช่องว่าง แต่ปรากฎว่าวงเล็บยังต้องหลบหนี ต้องใช้อักขระอื่นใดในการหลีกเลี่ยงชื่อไฟล์ที่ไม่อยู่ในเครื่องหมายคำพูด?


ไม่ชัดเจนเลยว่าคุณกำลังพยายามทำอะไร และการเติมข้อความอัตโนมัติเกี่ยวข้องกับอะไร
Michael Vehrs

@MichaelVehrs ฉันมีคำสั่งmv filename filename-fooใน bash ตัวละครใดที่ฉันต้องหลบหนีนอกจากช่องว่างและวงเล็บ?
jcubic

@MichaelVehrs ลบพูดถึงการเติมข้อความอัตโนมัติ
jcubic

โดยทั่วไปแล้วเชลล์เมตาอักขระทั้งหมดเช่นช่องว่างเชลล์โกลวเหตุการณ์ประวัติศาสตร์ mv "$filename" "$newname"ด้วยเหตุนี้คุณควรจะพูดชื่อไฟล์ทั้งหมดมากกว่าการหลบหนีอักขระแต่ละตัว:
Michael Vehrs

@MichaelVehrs ฉันรู้ว่าการอ้างถึงจะแก้ปัญหาด้วยการหลบหนี แต่ฉันต้องใช้ชื่อไฟล์โดยไม่ต้องใส่เครื่องหมายคำพูด ฉันมีเทอร์มินัลอีมูเลเตอร์และควรทำงานเมื่อผู้ใช้ไม่ใช้เครื่องหมายคำพูด
jcubic

คำตอบ:


22

ที่เป็นวิธีง่ายๆที่จะนำคำพูดเดียว ( ') ที่จุดเริ่มต้นและอีกคำพูดเดียวที่สิ้นสุดและจะแทนที่ทุกตัวละครภายในชื่อไฟล์โดยลำดับ' 4 ตัวอักษร '\''ตัวละครทุกตัวสูญเสียความหมายพิเศษของพวกเขาภายในสตริงที่ยกมาเดี่ยวยกเว้น'ตัวเองซึ่งทำเครื่องหมายจุดสิ้นสุดของสตริง ลำดับ'\''จะลงท้ายด้วยตัวอักษรที่ยกมาเดี่ยวตามด้วยคำพูดเดียวที่ยกมาทันทีและเปิดตัวอักษรที่ยกมาเดี่ยวใหม่ ดังนั้นชื่อไฟล์

This file's name has some weird characters!
Will you manage to escape them?

สามารถยกมาดังนี้:

somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'

เครื่องหมายอัญประกาศคู่มีกฎการหลบหนีที่ซับซ้อนมากขึ้นและไม่อนุญาตให้คุณใส่เครื่องหมายอัศเจรีย์!หากเปิดใช้งานการทดแทนประวัติดังนั้นฉันจะไม่พิจารณาสิ่งเหล่านี้เพิ่มเติม

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

ด้วยเชลล์ทั่วไป (ksh, bash หรือ zsh) คุณจำเป็นต้องอ้างอิงอักขระต่อไปนี้อย่างน้อยในบางสถานการณ์

  • ช่องว่าง (ช่องว่างแท็บขึ้นบรรทัดใหม่ - การจดจำว่าขึ้นบรรทัดใหม่ไม่สามารถอ้างอิงด้วยเครื่องหมายทับขวา)
  • ! - การขยายประวัติ
  • " - ไวยากรณ์เชลล์
  • #- ความคิดเห็นเริ่มต้นเมื่อนำหน้าด้วยช่องว่าง; สัญลักษณ์ตัวแทน zsh
  • $ - ไวยากรณ์เชลล์
  • & - ไวยากรณ์เชลล์
  • ' - ไวยากรณ์เชลล์
  • (- แม้ในช่วงกลางของคำ: ksh ขยาย globs (ยังมีอยู่ในทุบตีและ zsh); สัญลักษณ์ตัวแทน zsh
  • )(ดู()
  • * - ไวลด์การ์ด
  • , - เฉพาะการขยายรั้งภายใน
  • ; - ไวยากรณ์เชลล์
  • < - ไวยากรณ์เชลล์
  • = - ใน zsh เมื่ออยู่ที่จุดเริ่มต้นของชื่อไฟล์ (การขยายชื่อไฟล์ด้วยการค้นหา PATH)
  • > - ไวยากรณ์เชลล์
  • ? - ไวลด์การ์ด
  • [ - ไวลด์การ์ด
  • \ - ไวยากรณ์เชลล์
  • ] - คุณอาจหนีไปโดยไม่ทิ้งข้อความไว้
  • ^- การขยายประวัติ สัญลักษณ์ตัวแทน zsh
  • ` - ไวยากรณ์เชลล์
  • { - การขยายรั้ง
  • | - ไวยากรณ์เชลล์
  • } - จำเป็นต้องได้รับการหลบหนีใน zsh กระสุนอื่น ๆ นั้นนิ่มนวลกว่าเมื่อไม่มีการเปิดรั้งที่ตรงกัน
  • ~- การขยายไดเรกทอรีหลักเมื่ออยู่ที่จุดเริ่มต้นของชื่อไฟล์ สัญลักษณ์ตัวแทน zsh; ปลอดภัยเสมอเมื่อเป็นตัวละครตัวสุดท้าย

อักขระอีกสองสามตัวอาจต้องการการจัดการเป็นพิเศษในบางครั้ง:

  • -ไม่ใช่พิเศษสำหรับเชลล์ แต่เมื่ออยู่ที่จุดเริ่มต้นของอาร์กิวเมนต์คำสั่งจะระบุตัวเลือก ไม่สามารถป้องกันด้วยเครื่องหมายคำพูดได้เนื่องจากการจัดการพิเศษอยู่ในคำสั่งไม่ใช่ในเชลล์ เพื่อป้องกันชื่อไฟล์ที่ขึ้นต้นด้วย-คุณสามารถใส่./ก่อนหน้าได้ด้วยวิธีนี้มันยังคงเป็นไฟล์เดียวกัน แต่อาร์กิวเมนต์ไม่ได้เริ่มต้นด้วย-อีกต่อไป
  • .ไม่ได้มีความพิเศษในตัวเอง แต่ไฟล์ dot จะถูกแยกออกจาก*globs ตามค่าเริ่มต้น
  • :ไม่ใช่คำสั่งพิเศษสำหรับเชลล์ แต่คำสั่งบางคำสั่งแยกเป็นพิเศษเช่นเพื่อระบุไฟล์ระยะไกล ( hostname:filename) ศึกษาเอกสารของคำสั่งเพื่อดูวิธีจัดการกับชื่อไฟล์ที่มีโคลอน

¹ เว้นแต่ผู้ใช้กำหนดค่าอักขระส่วนขยายประวัติสำรอง กระสุนบางตัวยอมให้สิ่งนี้ นี่เป็นอีกเหตุผลที่ใช้เครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นแบ็กสแลช


ขึ้นบรรทัดใหม่อย่างน้อยLFเท่านั้นสามารถอ้างสิทธิ์ด้วยแบ็กสแลชในเชลล์บางตัว
iBug

@iBug ไม่ในเชลล์ที่มีลักษณะคล้าย sh, backslash + newline จะขยายเป็นสตริงว่างไม่ใช่บรรทัดใหม่
Gilles 'หยุดความชั่วร้าย'

นี่เป็นคำตอบที่ดีขอบคุณ มีลิงค์ไปยังที่ซึ่งข้อมูลนี้ 'เป็นทางการ' หรือไม่?
slashmais

1
@slashmais ข้อมูลอะไร? ไวยากรณ์ของภาษาเชลล์คือ "เป็นทางการ" ที่มีอยู่ในคู่มือและข้อกำหนดต่างๆ แต่จะไปจากที่นั่นเพื่อค้นหาว่าอักขระตัวใดที่จำเป็นต้องมีการอ้างอิงที่ไม่ตรงไปตรงมาอย่างสมบูรณ์
Gilles 'หยุดความชั่วร้าย' ใน

1
ฉันยังพบสิ่งนี้: tecmint.com/manage-linux-filenames-with-special-characters - มันไม่กะทัดรัดเท่ากับรายการของคุณ แต่มีตัวอย่างมากมาย (โดย - โดย: "ข้อมูลอะไร?" ไม่ใช่คำตอบที่ยอดเยี่ยมเมื่อหัวข้อที่นี่เกี่ยวข้องกับตัวละคร)
slashmais
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.