วิธีใช้ตัวละครพิเศษเป็นตัวละครธรรมดา


13

คำถามมากมายเช่น 'วิธีพิมพ์อักขระสองคำพูด (") ได้อย่างไร กำลังถูกถามและเราไม่ต้องการให้ชุมชนของเรามีคำตอบเหมือนกัน (พิมพ์เป็น\"ถ้าไม่อยู่ใน's, "ถ้าอยู่ใน's) ดังนั้นคำถามอยู่ที่นี่

คุณไม่สามารถพิมพ์ตัวอักษรพิเศษลงในเทอร์มินัลแบบปกติเช่นคำสั่งนี้จะล้มเหลว:

echo Updates (11)

ดังนั้นวิธีการพิมพ์ในตัวอักษรเหล่านี้ใน terminal เช่นถ้าพวกเขาเป็นคนปกติ?

!#$^&*?[](){}<>~;'"\|<space><tab><newline>

ไม่มี Unix shell ที่ฉันรู้ว่าcarriage-returnเป็นพิเศษ =, @และ%เป็นพิเศษในเปลือกหอยบางอย่างในบางบริบท
Stéphane Chazelas

@ StéphaneChazelas Umm ... carriage return ( ^M) ทำหน้าที่เหมือนตัวดึงข้อมูลบรรทัด ( ^J) ถึงฉัน (Ubuntu 14.04, sh)
EKons

ไม่ไดรเวอร์เทอร์มินัลของคุณแปลง^Mเป็น^Jอินพุต แต่^Mไม่ได้พิเศษกับเชลล์และไม่จำเป็นต้องมีการเสนอราคา พิมพ์echo ^V^M | hdและคุณจะเห็นอักขระ 0d (และ 0a ต่อท้ายด้วยเสียงสะท้อน)
Stéphane Chazelas

@ StéphaneChazelas Umm ... ฉันไม่รู้ว่าhdมันคืออะไรบางทีอาจxxdจะดีกว่าในฐานะผู้ดูฐานสิบหก
EKons

ใดก็ตาม ใช้ POSIX od -tx1หรือsed -n lหรือ xxd hdเป็นกลุ่มถ้าคุณไม่ได้มี บางระบบมีcat -vteหรือcat -A
Stéphane Chazelas

คำตอบ:


27

มันขึ้นอยู่กับเปลือกหอยเป็นอย่างมาก ตรวจสอบคู่มือเชลล์ของคุณสำหรับรายละเอียด

โปรดทราบว่าอักขระบางตัวมีความพิเศษเฉพาะในบริบทบางอย่าง ยกตัวอย่างเช่นในเปลือกหอยมากที่สุด*และ?เป็นเพียงพิเศษในบริบทรายการใน POSIX หรือ csh เหมือนเปลือกหอยเป็นพิเศษเพียงจุดเริ่มต้นของคำต่อไปนี้หรือตัวอักษรบางอย่างเช่น~ :เดียวกันใน= zshในเปลือกบาง[เป็นพิเศษเฉพาะเมื่อจับคู่ (ที่มีข้อ จำกัด บางอย่าง) ]โดย

ในบางเชลล์เช่นbashหรือyashอักขระพิเศษเช่นตัวคั่นโทเค็นว่างยังแตกต่างกันตามโลแคล

ตัวดำเนินการข้อความ (เพื่อลบความหมายพิเศษของตัวละครเหล่านั้น) ยังแตกต่างกันอย่างมากระหว่างเชลล์

กระสุนคล้ายบอร์น

ข้อมูลสรุปสำหรับเชลล์คล้าย Bourne (นั่นคือเชลล์ที่รู้จักกันว่าถูกเรียกใช้shบนระบบบางระบบหรือตั้งแต่ปี 80):

เชลล์เป้าหมาย

ตัวละครพิเศษ:

  • "\'&|;()^`<>$พื้นที่ช่องว่างขึ้นบรรทัดใหม่และแท็บเป็นพิเศษในบรรทัดคำสั่งง่าย ๆ เมื่อไม่ยกมา
  • #(ยกเว้นในรุ่นแรก) เป็นพิเศษที่จุดเริ่มต้นของบรรทัดต่อไปนี้หรือพื้นที่ unquoted &|()^<>;`แท็บหรือ
  • {และ}มีความพิเศษเฉพาะในสิ่งที่พวกเขาเป็นคำหลักเปลือก (เฉพาะคำที่อยู่ในตำแหน่งคำสั่ง)
  • *?[เป็นพิเศษในฐานะผู้ประกอบการแบบกลมดังนั้นเฉพาะในบริบทรายการ ในกรณีของ[มัน[...]ที่เป็นผู้ประกอบการ globbing อย่างใดอย่างหนึ่ง[หรือ]ต้องการเพียงที่จะยกมาเพื่อลบความหมายพิเศษ
  • =เป็นพิเศษเมื่ออยู่ในบริบทที่ถือว่าเป็นผู้ดำเนินการที่ได้รับมอบหมาย นั่นคือในคำสั่งง่าย ๆ สำหรับทุกคำที่ไม่ทำตามอาร์กิวเมนต์ (ยกเว้นหลังจากset -k)

การอ้างอิงตัวดำเนินการ

  • \อัญประกาศอักขระพิเศษทั้งหมดยกเว้นการขึ้นบรรทัดใหม่ ( \<newline>เป็นวิธีการต่อสายตรรกะยาวไปยังบรรทัดทางกายภาพถัดไปดังนั้นลำดับนั้นจะถูกเอาออก) โปรดทราบว่า backticks จะเพิ่มความซับซ้อนเป็นพิเศษภายในนั้น\ถูกใช้ก่อนเพื่อหลีกเลี่ยง backtick ที่ปิดและช่วยให้โปรแกรมแยกวิเคราะห์ ภายในราคาคู่\อาจจะใช้เพียงที่จะหลบหนีตัวเอง", $และ`( \<newline>ยังคงเป็นต่อของบรรทัด) "ภายในที่นี่เอกสารเดียวกันยกเว้น \เป็นวิธีเดียวในการหลบหนีอักขระที่อยู่ภายในเอกสาร
  • "..."ราคาสองตัวหนี แต่ตัวเอง\, และ$`
  • '...' อัญประกาศเดี่ยวยกเว้นอักขระทั้งหมดยกเว้นตัวของมันเอง

เปลือกหอย POSIX

POSIX เชลล์ส่วนใหญ่จะทำงานเหมือนกับเชลล์เป้าหมายยกเว้นว่า:

  • ^ ไม่มีตัวอักษรพิเศษอีกต่อไป
  • ~มีความพิเศษในบางบริบท
  • { ได้รับอนุญาตให้เป็นพิเศษดังนั้นควรจะยกมา

ksh

ชอบ POSIX ยกเว้นว่า:

  • {string}เป็นพิเศษถ้าสตริงมี unquote ,(หรือ..ในบางกรณีและบางรุ่น)
  • ksh93 มีตัวดำเนินการข้อความพิเศษเพิ่มเติม: $'...'พร้อมกฎที่ซับซ้อน ผู้ประกอบการที่ยังพบ (ด้วยรูปแบบบาง) ในbash, zsh, mkshและ FreeBSD และ shbusybox
  • ksh93นอกจากนี้ยังมีตัว$"..."ดำเนินการข้อความที่ทำงานเหมือน"..."ยกเว้นว่าสตริงนั้นขึ้นอยู่กับการแปล (สามารถกำหนดค่าได้ดังนั้นจึงแปลเป็นภาษาของผู้ใช้) mkshไม่สนใจใน$$"..."

bash

ชอบksh93แต่:

  • ในโลแคลอักขระไบต์เดียวอักขระว่าง (ตามโลแคล) ทั้งหมดถือว่าเป็นตัวคั่น (เช่นเว้นวรรคหรือแท็บ) นั่นหมายความว่าคุณควรอ้างอิงไบต์ทั้งหมดด้วยชุดที่ 8 ในกรณีที่พวกเขาอาจเป็นอักขระว่างในบางภาษา
  • เมื่อเปิดใช้งานการขยายประวัติ csh เหมือนในอินสแตนซ์แบบอินเทอร์แอคทีฟ!เป็นพิเศษในบางบริบท และ^เป็นพิเศษที่จุดเริ่มต้นของคำสั่ง

zsh

ชอบksh93แต่:

  • เช่นเดียวกับสำหรับbashการขยายประวัติ csh
  • =มีความพิเศษเป็นอักขระตัวแรกของคำ ( =lsขยายเป็น/bin/ls)
  • {และ}ยังสามารถเปิดและปิดกลุ่มคำสั่งเมื่อไม่ได้คั่นด้วย (ในการ{echo text}ทำงานเหมือนของ Bourne { echo text;})
  • ยกเว้น[เพียงอย่างเดียวความต้องการที่ยกมาแม้ว่าจะไม่ได้ปิดด้วย[]
  • ด้วยextendedglobตัวเลือกที่เปิดใช้งาน#, ^และ~จะ globbing ผู้ประกอบการ
  • ด้วยbracecclตัวเลือก{non-empty-string}เป็นพิเศษ
  • $"..." ไม่รองรับ
  • เป็นมุมแหลมพิเศษ?ไม่พิเศษเมื่อทำตาม%(แม้จะยกมาหรือขยาย) ที่จุดเริ่มต้นของคำ (เพื่อให้สเปค%?nameงาน)
  • rcquotesตัวเลือก (ไม่ได้เปิดใช้งานโดยค่าเริ่มต้น) ช่วยให้หนึ่งเพื่อใส่คำพูดเดียว''ราคาเดียวภายในàลาrc(ดูด้านล่าง)

yash

ชอบPOSIXยกเว้นว่า

  • อักขระว่างทั้งหมดถือเป็นตัวคั่น
  • ด้วยbrace-expandตัวเลือกนี้จะใช้การขยายปีกกาแบบ zsh

สำหรับเชลล์ทั้งหมดมีบริบทพิเศษบางอย่างที่การอ้างอิงทำงานแตกต่างกัน เราได้กล่าวแล้วที่นี่เอกสารและ backticks แต่ยังมี[[...]]ใน ksh และไม่กี่เปลือกหอยอื่น ๆ POSIX $((...)), caseโครงสร้าง ...

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

สรุป

ในเชลล์คล้ายบอร์น!#$^&*?[(){}<>~;'"`\|=, SPC, TAB, NEWLINE และบางไบต์ที่มีชุดบิตที่ 8 เป็นหรืออาจเป็นพิเศษ (อย่างน้อยในบางบริบท)

ในการลบความหมายพิเศษเพื่อให้ได้รับการปฏิบัติอย่างแท้จริงคุณใช้ข้อความ

ใช้:

  • '...' เพื่อลบความหมายพิเศษของตัวละครทุกตัว:

    printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
    single arguments (without the enclosing quotes) to `printf`'
    
  • \ เพื่อลบความหมายพิเศษของอักขระหนึ่งตัวเท่านั้น:

    printf '<%s>\n' foo bar\ baz #comment

    ข้างต้นเท่านั้นอักขระช่องว่างนำโดยถูกส่งผ่านไปยังตัวอักษร\ printfอีกอันหนึ่งถือว่าเชลล์เป็นตัวคั่นโทเค็น

  • ใช้"..."ในการอ้างอิงตัวละครในขณะที่ยังช่วยให้การขยายตัวพารามิเตอร์ ( $var, $#, ${foo#bar}... ), การขยายตัวทางคณิตศาสตร์ ( $((1+1))ยัง$[1+1]อยู่ในเปลือกหอยบางส่วน) และคำสั่งเปลี่ยนตัว ( $(...)หรือรูปแบบเก่า`...`. จริงส่วนใหญ่ของเวลาที่คุณไม่ต้องการที่จะนำการขยายภายในเหล่านั้น อัญประกาศคู่ในกรณีใด ๆคุณสามารถใช้\ภายใน"..."เพื่อลบความหมายพิเศษของตัวละครที่ยังคงพิเศษ (แต่พวกเขาเท่านั้น)
  • ถ้าสตริงมี'อักขระ, คุณยังสามารถใช้'...'สำหรับส่วนที่เหลือและใช้กลไกข้อความอื่น ๆ ที่สามารถพูด'เหมือน"'"หรือ\'หรือ (ถ้ามี) $'\'':

    echo 'This is "tricky", isn'\''t it?'
  • ใช้$(...)รูปแบบที่ทันสมัยของการทดแทนคำสั่ง ใช้ของเก่าเท่านั้น`...`สำหรับความเข้ากันได้กับเชลล์เป้าหมายนั่นคือระบบเก่ามากและเฉพาะในการกำหนดตัวแปรตามที่ไม่ได้ใช้:

    echo "`echo "foo bar"`"

    ซึ่งจะไม่ทำงานกับ Bourne shell หรือ AT&T เวอร์ชัน ksh หรือ:

    echo "`echo \"foo bar\"`"

    ซึ่งจะทำงานกับ Bourne และ AT&T ksh แต่ไม่ใช่ด้วยyashแต่ใช้:

    var=`echo "foo bar"`; echo "$var"

    ซึ่งจะทำงานกับทั้งหมด

    การวางซ้อนคำหลักด้วยเครื่องหมายคำพูดคู่นั้นเป็นไปไม่ได้ดังนั้นให้ใช้ตัวแปรอีกครั้ง ระวังการประมวลผลแบ็กสแลชพิเศษด้วย:

    var=`printf '%s\n' '\\'`

    จะเก็บเครื่องหมายแบ็กสแลชหนึ่งอันไว้ข้างใน$varเท่านั้นเนื่องจากมีการประมวลผลแบ็กสแลชในระดับพิเศษ (สำหรับ\, `, และ$(และ"เมื่ออ้างถึงยกเว้นในyash)) ภายในแบ็คทีกเกอร์ดังนั้นคุณจึงต้องการ

    var=`printf '%s\n' '\\\\'`

    หรือ

    var=`printf '%s\n' '\\\'

    แทน.

ครอบครัว Csh

csh และ tcsh มีรูปแบบที่แตกต่างกันอย่างมีนัยสำคัญแม้ว่าจะยังมีจำนวนมากที่เหมือนกันกับเชลล์เป้าหมายในขณะที่พวกเขาแบ่งปันมรดกร่วมกัน

ตัวละครพิเศษ:

  • "\'&|;()^`<>$พื้นที่ช่องว่างขึ้นบรรทัดใหม่และแท็บพิเศษทุกที่เมื่อไม่มีการเสนอราคา
  • #(csh เป็นเชลล์ที่นำเสนอ#ในฐานะผู้นำความคิดเห็น) เป็นพิเศษที่จุดเริ่มต้นของสคริปต์หรือทำตามช่องว่างแท็บหรือการขึ้นบรรทัดใหม่
  • *?[ มีความพิเศษเหมือนโอเปอเรเตอร์ globbing ดังนั้นในบริบทรายการ
  • {non-empty-string} เป็นพิเศษ (csh คือเชลล์ที่แนะนำการขยายรั้ง)
  • !และ^พิเศษเป็นส่วนหนึ่งของการขยายประวัติ (อีกครั้งการประดิษฐ์ csh) และกฎการอ้างถึงเป็นพิเศษ
  • ~ (การขยายตัวหนอนยังเป็นสิ่งประดิษฐ์ csh) เป็นพิเศษในบริบทบางอย่าง

การอ้างอิงตัวดำเนินการ

พวกมันเหมือนกับเชลล์เป้าหมาย แต่พฤติกรรมนั้นแตกต่างกัน tcsh ทำงานเหมือน csh จากมุมมองไวยากรณ์คุณจะพบว่า csh หลายเวอร์ชันมีข้อบกพร่องที่น่ารังเกียจ รับ tcsh รุ่นล่าสุดเพื่อรับ csh เวอร์ชันที่ใช้งานได้ประมาณ

  • \ยกเว้นอักขระเดี่ยวยกเว้นขึ้นบรรทัดใหม่ (เหมือนกับเชลล์เป้าหมาย) มันเป็นโอเปอเรเตอร์ตัวเดียวที่สามารถหลบหนี!ได้ \<newline>ไม่ได้หลบหนี แต่เปลี่ยนจากตัวแยกคำสั่งเป็นตัวแยกโทเค็น (เช่นช่องว่าง)
  • "..."หนีออกมาตัวละครทุกตัวยกเว้นตัวเอง$, `, !บรรทัดใหม่ ตรงกันข้ามกับ Bourne shell คุณไม่สามารถใช้\เพื่อหลบหนี$และ`เข้าด้านใน"..."แต่คุณสามารถใช้\เพื่อหลบหนี!หรือขึ้นบรรทัดใหม่ (แต่ไม่ใช่ตัวเองยกเว้นเมื่อก่อนหน้า!หรือขึ้นบรรทัดใหม่) ตัวอักษร!มี"\!"และตัวอักษรมี\!"\\!"
  • '...' หนีอักขระทั้งหมดยกเว้นตัวเอง!และขึ้นบรรทัดใหม่ เช่นเดียวกับเครื่องหมายคำพูดคู่!และขึ้นบรรทัดใหม่สามารถหนีด้วยแบ็กสแลช
  • การทดแทนคำสั่งเป็นเพียงผ่านทาง`...`ไวยากรณ์และแทบจะไม่สามารถใช้งานได้อย่างน่าเชื่อถือ
  • การทดแทนตัวแปรนั้นค่อนข้างออกแบบมาไม่ดีและเกิดข้อผิดพลาดได้ง่าย $var:qผู้ประกอบการจะช่วยให้การเขียนรหัสตัวแปรที่เกี่ยวข้องกับความน่าเชื่อถือมากขึ้น

สรุป

อยู่ห่างจาก csh ถ้าคุณทำได้ หากคุณไม่สามารถใช้:

  • อัญประกาศเดี่ยวเพื่ออ้างอิงอักขระส่วนใหญ่ และการขึ้นบรรทัดใหม่ยังคงต้อง!\
  • \ สามารถหลบหนีตัวละครส่วนใหญ่
  • "..."สามารถอนุญาตให้มีการขยายภายในบางส่วนได้ แต่นั่นก็ค่อนข้างบั๊กถ้าพวกเขาฝังอักขระขึ้นบรรทัดใหม่และ / หรือเครื่องหมายแบ็กสแลชสิ่งที่ดีที่สุดคือการใช้เครื่องหมายคำพูดเดี่ยวเท่านั้นและ$var:qสำหรับการขยายตัวแปร คุณจะต้องใช้ลูปถ้าคุณต้องการเข้าร่วมองค์ประกอบของอาร์เรย์ที่เชื่อถือได้

rc ครอบครัว

rcเป็นplan9เปลือกและชอบลูกหลานของมันesและakangaได้รับการ ported เพื่อ Unix และชอบ Unix นั่นคือเชลล์ที่มีรูปแบบที่สะอาดและดีกว่าและคนที่ทุกคนจะใช้ถ้าเราไม่ได้ติดอยู่กับเชลล์ที่มีลักษณะคล้ายบอร์นเพื่อการทำงานร่วมกันแบบย้อนหลัง

rc/akanga

ตัวละครพิเศษ

  • #;&|^$=`'{}()<>, SPC, TAB และ NEWLINE จะพิเศษเสมอเมื่อไม่มีการเสนอราคา
  • *?[ เป็นผู้ประกอบการ globbing

ตัวดำเนินการการอ้างอิง

'...'เป็นโอเปอเรเตอร์ตัวเดียว ครอกที่'เขียนด้วย''คำพูดเดียวใน:

 echo 'it''s so simple isn''t it?'

es

esอาจจะเห็นเป็นทดลองrcเปลือกขึ้นอยู่กับ

มันมีความแตกต่างเล็กน้อย หนึ่งในสิ่งที่น่าสนใจสำหรับ Q / A นี้ก็\คือตัวดำเนินการที่อ้างถึง (ที่พูดถึงอักขระพิเศษทั้งหมดยกเว้นการขึ้นบรรทัดใหม่) และยังสามารถใช้เพื่อแนะนำลำดับ escape เช่น\nสำหรับการขึ้นบรรทัดใหม่\bสำหรับแบ็กสแลช ...

ปลา

ปลาเป็นผู้ใช้ใหม่ที่สัมพัทธ์ (ประมาณปี 2005) มีวัตถุประสงค์หลักสำหรับการใช้งานแบบโต้ตอบและยังมีไวยากรณ์ที่แตกต่างกันอย่างมีนัยสำคัญจากเปลือกหอยอื่น ๆ

ตัวอักษรพิเศษ

  • "'\()$%{}^<>;&|พิเศษเสมอเมื่อไม่ยกมา (หมายเหตุ%(สำหรับการขยาย pid) เป็นความแตกต่างอย่างมีนัยสำคัญจากกระสุนอื่น ๆ และ`ไม่พิเศษ)
  • # (ความคิดเห็น) พิเศษเมื่อติดตามช่องว่างแท็บขึ้นบรรทัดใหม่หรือ ;&|^<>
  • *?(แต่ไม่ใช่[...]) ตัวดำเนินการแบบกลม

การอ้างอิงตัวดำเนินการ

  • \อัญประกาศอักขระพิเศษเดียวยกเว้นการขึ้นบรรทัดใหม่ แต่ระวังว่ามันจะเพิ่มเป็นคู่ตามลำดับตัวหลีกเลี่ยง C ( \n, \b... ) IOW \nไม่ได้อ้างถึงnแต่ขึ้นบรรทัดใหม่
  • "..."อัญประกาศทุกอย่าง แต่ตัวของมันเอง$และแบ็กสแลชและแบ็กสแลชสามารถใช้เพื่อหลบหนีสิ่งเหล่านั้น \<newline>เป็นความต่อเนื่องสาย (ออก) "..."ภายใน
  • '...'พูดทุกอย่างยกเว้นตัวเองและ\และคุณสามารถใช้แบ็กสแลชเพื่อหลบหนีสิ่งเหล่านั้น

ผมได้รวมเฉพาะคนพิเศษในทุกบริบท (เพื่อให้cทำหน้าที่เช่นเดียวกับ\c, cไม่ออกc: command not foundใน STDERR, ฯลฯ ) และผมกำลังพูดถึงshที่นี่ นอกจากนี้โปรดจำไว้ว่านี่เป็นคำถามที่ "ทำความสะอาด" นั่นคือที่นี่เพื่อครอบคลุมตัวละครดังกล่าวทั้งหมดดังนั้นจึงไม่ต้องถามคำถามมากกว่า 19 ข้อ คำถามถูกโพสต์ด้วยเหตุการณ์ที่ถามคำถามที่แตกต่างกันสำหรับตัวละครที่แตกต่างกันเราต้องการล้างที่นี่!
EKons

ดี?[จะ globbing ผู้ประกอบการ แต่ไม่ได้เป็นพิเศษในบริบททั้งหมด แต่*น่าจะเป็นเพราะecho *ไม่ดีechoes เนื้อหาของไดเรกทอรีปัจจุบัน (ไม่ได้หลบหนีอะไร) echo ?สะท้อนตัวอักษร?และเสียงสะท้อนตัวอักษรecho [ [นอกจากนี้ยัง]เป็นผู้สังเกตการณ์ที่ทำให้ตกตะลึงด้วยเช่นกัน
EKons

1
@ ΈρικΚωνσταντόπουλος *ในฐานะที่เป็น glob ขยายไปยังไฟล์?ที่ไม่ได้ซ่อนทั้งหมด[a-z]ไปยังไฟล์ที่เป็นอักขระตัวเดียวที่ไม่ได้ซ่อนไว้ไปยังไฟล์ที่มีชื่อเป็นอักขระตัวเดียวระหว่าง a และ z เป็นต้น เมื่อพวกเขาไม่ตรงกับไฟล์ใด ๆ (เช่นในกรณีของคุณ?) ขึ้นอยู่กับเชลล์คุณจะได้รับข้อผิดพลาดที่ไม่ตรงกันหรือรูปแบบขยายตัวเอง ไม่ว่าในกรณีใดแม้บนเชลล์ที่ขยายไปถึงตัวเองพวกเขาจำเป็นต้องอ้างถึงในกรณีที่พวกเขาอาจจับคู่ไฟล์
Stéphane Chazelas

แต่ไม่ใช่ว่าเป็นก้อนกลม แต่*ก็ยังขยายไปถึงบางสิ่ง
EKons

@ ΈρικΚωνσταντόπουλος *เป็นเหมือน?ถ้ามันไม่ตรงกัน (สำหรับกรณี*คนเดียวนั่นคือเมื่อมีเพียงไฟล์ที่ซ่อนอยู่ในไดเรกทอรีปัจจุบันสำหรับa*ที่ที่ไม่มีไฟล์ที่มีชื่อขึ้นต้นด้วยa... ) มันอาจขยายไป ตัวเอง (ส่วนใหญ่บอร์นเหมือนเปลือกหอย) หรือก่อให้เกิดข้อผิดพลาดที่ไม่มีการแข่งขัน ( csh, tcsh, fish(เตือน) zsh, bash -O failglobต้นเปลือกหอย Unix), (หรือขยายเพื่ออะไรด้วยตัวเลือก nullglob ของเปลือกหอยบางส่วนหรือถ้ามีรูปแบบอื่นที่ขยายตัวไป บางสิ่งใน csh, tcsh, zsh -o cshnullglob, unix shells)
Stéphane Chazelas

4

1. หลบหนี

หลีกเลี่ยงตัวละครทั้งหมดเหล่านี้ด้วย a \เช่นนี้ (ไม่สามารถใช้กับการขึ้นบรรทัดใหม่ / การขึ้นบรรทัดใหม่):

$ echo Use a \"\\\" symbol to escape characters.
Use a "\" symbol to escape characters.

2 อ้างสองครั้ง

ใส่ข้อความทั้งหมดใน"s ดังนี้:

$ var=variables;echo "Enclose text in \"s. You can also use $var in them. `echo Surprise!!!`"
Enclose text in "s. You can also use variables in them. Surprise!!!

3. ใบเสนอราคาเดียว

เหมือนกับเครื่องหมายคำพูดคู่ แต่ไม่มีโทเค็นพิเศษ

$ proof=proveit;echo 'This should not read "proveit": $proof'
This should not read "proveit": $proof

1
คุณกำลังอธิบายพฤติกรรมของfishเชลล์ไม่ใช่เชลล์เหมือน Bourne โดยที่เครื่องหมายอัญประกาศเดี่ยวอ้างถึงอักขระทุกตัว (เครื่องหมายแบ็กสแลชไม่ได้อยู่ภายในพิเศษ'...') ทราบว่าในfish, %นอกจากนี้ยังเป็นตัวละครพิเศษ
Stéphane Chazelas

@ StéphaneChazelasผมไม่ทราบว่าวิธีfishการทำงาน แต่ประสบการณ์ของผมคือว่าในsh, echo '\\'ก้อง\ และเสียงสะท้อนecho '\'' '
EKons

1
echo '\\'เอาท์พุท \ เพราะคุณechoขยายลำดับการหลีกเลี่ยง ANSI C ( echoการใช้งานบางอย่างต้องการecho -e '\\'สิ่งนั้น) printf '%s\n' '\\'เอาท์พุท \\
Stéphane Chazelas

โปรดทราบว่าไม่ได้ระบุเปลือกโดยเฉพาะอย่างยิ่งมีและได้รับจำนวนมากของเปลือกหอยที่แตกต่างกันและมักจะเข้ากันไม่ได้ที่เรียกว่าsh sh
Stéphane Chazelas

@ StéphaneChazelasโอเคฉันจะเปลี่ยนมันแล้วตอนนี้ โดยวิธีการที่เป็น\'พิเศษ token ภายในลำดับตัวอักษรตัวเดียวที่ยกมา?
EKons
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.