ความหมายของ“ '” (apostrophe) ในคำสั่งเทอร์มินัล


11

ด้วยเหตุผลแปลก ๆ ฉันลองใช้ '' 'เป็นตัวคั่นคำในตัวระบุเช่นเดียวกับใน:

$ export foo'bar=1
> 
> ^C
$ 

ผลลัพธ์ดังที่แสดงไว้ด้านบนid คือการเปลี่ยนพร้อมท์เป็น ">" และระบบจะรอข้อมูลเพิ่มเติมในส่วนของฉันอย่างชัดเจน อย่างที่คุณเห็นฉันต้อง ctrl-C เพื่อหลบหนี สิ่งเดียวกันเกิดขึ้นโดยใช้คำสั่งอื่นเช่น

$ ls foo'bar
$ mkdir foo'bar

ฉันอยากรู้เกี่ยวกับความรู้สึกทั้งหมดนี้นั่นคือสิ่งที่มีความหมายพิเศษ "" "ในคำสั่งเทอร์มินัล

พิเศษ:นอกเหนือจากนี้ฉันยังต้องการทราบชุดอักขระพิเศษหรือไม่ถูกต้องในชื่อไฟล์และโฟลเดอร์ทั้งในระบบ Unix-like และ Windows (เพื่อให้ได้ชุดย่อยทั่วไปของเซฟ) (โดยเฉพาะสิ่งที่เกี่ยวกับทั้งหมด ไม่ใช่ ASCII?)

ขอบคุณเดนิส


ในโลก Linux อนุญาตให้ใช้อักขระทั้งหมดยกเว้น \ 0 (null) และ / อย่างไรก็ตามนั่นไม่ได้หมายความว่าพวกเขาทั้งหมดแนะนำให้เลือก หลายคนคิดว่าควรหลีกเลี่ยงตัวละครที่มีความหมายพิเศษกับเชลล์มากที่สุด หากคุณต้องการทราบเกี่ยวกับ Windows ให้ศึกษาข้อมูลอ้างอิง Windows
Scott Severance

คำตอบ:


15

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

ตัวอย่าง:

 $ echo '$HOME'

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

หากคุณต้องการใช้เครื่องหมายวรรคตอนตามที่เป็นอยู่คุณต้องหลบหนี:

 $ mkdir foo\'bar

 $ cd foo\'bar

ถ้ามันไม่รอดมันจะรอให้มันปิดคู่เหมือนที่มันเกิดขึ้นในตัวอย่างแรกของคุณ

ดังนั้นแก้ไขคำสั่งของคุณจะเป็น:

 $ export foo\'bar=1

หมายเหตุ: ดัง ที่ Milan Todorovic สังเกตเห็นสิ่งนี้จะไม่ถูกต้องเนื่องจากคุณไม่สามารถใช้เครื่องหมายอัญประกาศเดี่ยวได้ในกรณีนี้


1
@ denis63 โปรดยอมรับคำตอบถ้ามันเป็นสิ่งที่คุณจำเป็นต้องดู :)
Rinzwind

7

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

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

ซึ่งหมายความว่าอาร์กิวเมนต์สำหรับlsเป็นและไม่ได้ทุกอย่างที่ขึ้นต้นด้วยbla*bla

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

หากคุณต้องการที่จะใช้ในชื่อโฟลเดอร์คุณต้องหนีมันเช่นนี้' \'ดังนั้นหากคุณต้องการไปยังโฟลเดอร์รายการชื่อคุณควรจะพิมพ์foo'barls foo\'bar

โอ้และฉันไม่แน่ใจว่าจะใช้'ชื่อตัวแปรสภาพแวดล้อมได้หรือไม่ ผมคิดว่าคุณไม่สามารถใช้export foo\'bar=1,

หวังว่านี่จะช่วยได้


โหวตขึ้นสำหรับการสังเกตของคุณเกี่ยวกับการ จำกัด ชื่อตัวแปรสภาพแวดล้อม
Frantique

ยังไม่สามารถโหวตได้ (ใหม่สำหรับถาม Ubuntu) แต่มีความรู้สึกอยู่ ตรวจสอบเกี่ยวกับชื่อ env var เป็นเพียงแค่คุณพูด (ฉันรู้สึกโง่เล็กน้อยที่จะไม่คิดที่จะเปิด / ปิดตัวคั่น แต่ฉันคิดว่า "'" เป็นเครื่องหมายอะโพสโทรฟีตัวจริงไม่ใช่คำพูดเดียว) เดนิส
63
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.