ทำไมบางครั้งฉันถูกถามซ้ำ ๆ ด้วย“>” ในเครื่อง


19

เอาล่ะเมื่อฉันรันคำสั่งบางอย่างในทางที่ผิด (สะกดผิด ฯลฯ ) เทอร์มินัลจะแสดงผลลัพธ์ดังนี้: >แทนที่จะเป็นcomputername:workingfolder username$และเมื่อฉันพิมพ์ให้ป้อนมันจะเป็นดังนี้:

>

>

>

ถ้าฉันกด Enter 3 ครั้ง

คำตอบ:


43

> เป็นพรอมต์ต่อเนื่องเริ่มต้นนั่นคือสิ่งที่คุณจะเห็นว่าสิ่งที่คุณป้อนก่อนหน้านี้มีเครื่องหมายคำพูดที่ไม่สมดุล

ตัวอย่างเช่นพิมพ์เครื่องหมายคำพูดเดี่ยวบนบรรทัดคำสั่งแล้วตามด้วยenterคีย์สองสามตัว:

$ '
> 
> 
> 

การแจ้งเตือนความต่อเนื่องจะเกิดขึ้นจนกว่าคุณจะทำเช่นนั้น

  • (a) กรอกคำสั่งด้วยเครื่องหมายอัญประกาศปิด

    หรือ

  • (b) พิมพ์Ctrl+ Dเพื่อสิ้นสุดอินพุตซึ่ง ณ จุดนั้นเชลล์จะตอบกลับพร้อมกับข้อความแสดงข้อผิดพลาดเกี่ยวกับเครื่องหมายคำพูดที่ไม่สมดุล

    หรือ

  • (c) พิมพ์Ctrl+ Cซึ่งจะยกเลิกคำสั่งที่คุณป้อน

สิ่งนี้มีประโยชน์อย่างไร

บางครั้งคุณอาจต้องการป้อนสตริงที่มีบรรทัดใหม่ฝังอยู่ คุณสามารถทำได้ดังนี้

$ paragraph='first line
> second line
> third line
> end'

ตอนนี้เมื่อเราแสดงตัวแปรเชลล์คุณจะเห็นว่าพรอมต์หายไป แต่บรรทัดใหม่จะยังคงอยู่:

$ echo "$paragraph"
first line
second line
third line
end

16

ที่จะเกิดขึ้นหากคุณมีคำพูดที่ไม่เปิดเผยในคำสั่งของคุณ นั่นคือสิ่งที่ชอบ:

$ echo "test here
>
>
...

คุณสามารถออกจากโหมดนั้นได้โดยปิดคำพูด (เขียน"หรือ'หรืออ้างถึงสิ่งที่คุณเปิด) มันอาจจะเป็นบล็อกที่มีการคั่นด้วยเครื่องหมายวงเล็บ, การทำให้สมบูรณ์บางส่วนfor-doหรือการwhile-doวนซ้ำ, หรือการสร้างอื่น ๆ คุณสามารถกดCtrl-Cเพื่อยกเลิกคำสั่งนี้ (จากนั้นกดUpเพื่อแก้ไข)

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


ค่า>ของคุณคือPS2("พรอมต์รอง") คุณสามารถเปลี่ยนสิ่งนั้นเป็นอย่างอื่นเพื่อเตือนคุณว่าเกิดอะไรขึ้น:

PS2="Unclosed >"

ในของคุณ.bashrcจะทำให้มันพิมพ์Unclosed >ที่จุดเริ่มต้นของแต่ละบรรทัดแทน


7

นอกเหนือจากคำตอบอื่น ๆ คุณยังได้รับพรอมต์ต่อเนื่องเมื่อคุณพิมพ์ a \เป็นอักขระตัวสุดท้ายในบรรทัด


5
(สำหรับฉันนี่มักจะเกิดขึ้นโดยไม่ได้ตั้งใจเนื่องจากแบ็กสแลชใกล้กับปุ่ม Enter อย่างน่ากลัว)
Mr Lister

ไม่ได้อยู่บนคีย์บอร์ดของฉันมันไม่ใช่
TRiG

@TRiG คุณหมายถึงคุณมักจะพิมพ์ # โดยบังเอิญแทนที่จะเป็น \? ใช่ ...
มิสเตอร์ลิสเตอร์

7

คำตอบอยู่ที่การกล่าวถึงเป็นความลับในคู่มืออ้างอิง Bash :

5.1 ตัวแปรเชลล์เป้าหมาย

[ ... ]

  • PS1: สตริงพรอมต์หลัก ค่าเริ่มต้นคือ ' \s-\v\$' โปรดดูที่การพิมพ์พรอมต์สำหรับรายการลำดับการยกเว้นทั้งหมดที่ขยายก่อนที่PS1จะแสดงขึ้น
  • PS2: สายอักขระพรอมต์รอง ค่าเริ่มต้นคือ ' >'

ตามด้วย :

6.3.3 พฤติกรรมเชลล์แบบโต้ตอบ

  1. Bash ขยายและแสดงPS1ก่อนอ่านบรรทัดแรกของคำสั่งและขยายและแสดงPS2ก่อนอ่านบรรทัดที่สองและบรรทัดถัดไปของคำสั่งหลายบรรทัด

ดังนั้น>พรอมต์จะปรากฏขึ้นหากคุณกดEnterและ Bash จะพิจารณาว่าคำสั่งนั้นไม่สมบูรณ์ อาจเป็นเพราะ:

  • ตัวละครก่อนที่จะขึ้นบรรทัดใหม่เป็น\ซึ่งจะถือว่าเป็นความต่อเนื่องบรรทัด
  • คุณมีสตริงไม่สมบูรณ์ (ไม่ตรงกันคำพูดหรือ unterminated นี่ doc) หรือบางตัวคั่นที่ไม่ตรงกันอื่น ๆ เช่น$(), ,()``
  • คุณได้เริ่มต้นนิยามฟังก์ชันเป็นforห่วงเป็นห่วงหรือwhilecase

หากคุณเห็นพรอมต์รองเนื่องจากข้อผิดพลาดในการพิมพ์โดยไม่ได้ตั้งใจให้กดปุ่มControlCเพื่อกลับไปที่พรอมต์หลัก


นอกจากนี้คุณยังได้รับพรอมต์สำรองเมื่อคุณพิมพ์ที่นี่ doc แต่นี่มีโอกาสน้อยที่จะเกิดขึ้นโดยบังเอิญกว่าคนอื่น
Barmar

6

เชลล์รอให้คุณทำคำสั่งให้สมบูรณ์ อาจจะมีการเสนอราคาที่ไม่มีการปิดผนึกบางแห่งหรือคิดว่าคุณกำลังเริ่มการวน "สำหรับ" และรอให้ผู้ใช้พิมพ์เสร็จ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.