ปิดใช้งานพฤติกรรมการคัดลอกและวางเริ่มต้นใน Bash


9

เมื่อฉันวางในเซสชันเทอร์มินัลของฉันเชลล์ดำเนินการคำสั่งทันทีโดยไม่ต้องกดปุ่ม Enter

ฉันไม่รู้วิธีปิดใช้งานพฤติกรรมดังกล่าวจริงๆ

ฉันใช้เทอร์มินัลที่ติดตั้งไว้แล้วใน MacOS Yosemite


9
มันทำอย่างนั้นแน่นอนถ้าวางบัฟเฟอร์มีการขึ้นบรรทัดใหม่ สิ่งนี้มี (เกือบ) ไม่มีอะไรเกี่ยวข้องกับการทุบตี (มันเกี่ยวข้องกับการทุบตีเฉพาะถ้าและเท่าที่จะใช้ห้องสมุด readline.)
ปีเตอร์ - Reinstate Monica

... และยังbash(ด้วยความช่วยเหลือของreadline) มีการแก้ไข
alexis

คำตอบ:


16

ด้วยbash4.4 หรือใหม่กว่าและในเทอร์มินัลที่รองรับการวาง a la xtermคุณสามารถทำสิ่งต่อไปนี้

bind 'set enable-bracketed-paste'

(หรือเพิ่มset enable-bracketed-pasteในของคุณ~/.inputrc)

ที่จะทำให้เกิดการ copy-paste buffer จะถูกแทรกที่พร้อมท์แทนของตัวละครในนั้นที่จะตีความว่าถ้าพิมพ์ (คุณอาจจะยังคงมีปัญหาถ้าบัฟเฟอร์ที่มีตัวอักษรเช่น^C, ^Zและจำลอง terminal ของคุณไม่ได้กรองออก) .

zsh ทำตามค่าเริ่มต้นตั้งแต่รุ่น 5.1

สำหรับเชลล์หรือเทอร์มินัลอื่น ๆ ดูเพิ่มเติม: ฉันจะป้องกันตัวเองจากการละเมิดคลิปบอร์ดประเภทนี้ได้อย่างไร


ฉันจะตรวจสอบมัน
Opaldes

ดูเหมือนว่าบูธจะทำงานไม่ได้
Opaldes

@Opaldes คุณลองทำอะไร รุ่นใดของเชลล์และเทอร์มินอลใดบ้าง? ฉันเชื่อว่า OS / X มาพร้อมกับxtermคุณสามารถลองใช้แทนได้ คุณลองใช้perlสคริปต์ในคำถามที่เชื่อมโยงแล้วหรือยัง
Stéphane Chazelas

1
@Opaldes ตามรหัสการวางลงในหน้าต่างเทอร์มินัลเป็นกลุ่มบน Mac OS X OS / X Terminal รองรับการวางแบบวงเล็บตั้งแต่ OS / X Lion ดังนั้นมันจะดูเหมือนทั้งหมดที่คุณต้องการคือ zsh หรือ bash รุ่นล่าสุด ด้วยเวอร์ชัน zsh ที่สามารถทำได้ผ่านการกำหนดค่า
Stéphane Chazelas

1
เราขอขอบคุณ Daniel Colascione สำหรับการเพิ่มคุณสมบัติที่มีประโยชน์นี้ใน Bash / Readline: gnu-bash.2382.n7.nabble.com/…
Anthony Geoghegan

6

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

วิธีที่ง่ายที่สุดคือการคัดลอกทีละบรรทัดและพลาดอักขระตัวสุดท้ายแล้วเพิ่มมันภายหลังด้วยตนเอง

หรือตามที่ the_velour_fog ชี้ให้เห็นด้านล่างคุณสามารถวางลงในเครื่องมือแก้ไขที่แสดงตัวอักษรที่ไม่ได้พิมพ์และเลือกใหม่โดยไม่ต้องขึ้นบรรทัดใหม่

มีวิธีแก้ไขปัญหาหนึ่งหรือสองอย่างที่ลอยไปมาสำหรับ GNU / Linux distros แต่ไม่ทราบว่าแนวคิดนั้นสามารถส่งไปยัง MacOS ได้หรือไม่ ลองดูที่นี่และดูว่ามีไฟล์ที่คล้ายกันใน mac ที่คุณสามารถแก้ไขได้หรือไม่ น่าเสียดายที่ฉันสงสัย


ฉันเพิ่งวางลงในโปรแกรมแก้ไขที่แสดงตัวอักษรที่ไม่ได้พิมพ์จากนั้นเลือกใหม่โดยไม่ต้องขึ้นบรรทัดใหม่
the_velour_fog

คำแนะนำที่ดีแก้ไขเพื่อรวมไว้
I_GNU_it_all_along

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

มันเป็นความเจ็บปวด แต่มีประโยชน์เมื่อทำการคัดลอกชุดคำสั่ง
I_GNU_it_all_along

"วิธีแก้ปัญหา" ของฉันก็เป็นวิธีแก้ปัญหาแฮ็ค แต่ก็เร็วกว่าการเลือก IMO แยกต่างหาก
Peter Cordes

5

ก่อนวางให้พิมพ์ใบเสนอราคาเดียวแล้ววาง control-c และ up-arrow เพื่อแก้ไขเป็นหนึ่งบรรทัดยักษ์

เครื่องหมายคำพูดคู่ยังใช้งานได้ในกรณีที่ข้อความมีเครื่องหมายคำพูดเดี่ยว แต่ไม่ใช่เครื่องหมายคำพูดคู่ ไม่เป็นไรถ้ามันมี$หรือสิ่งอื่น ๆ ที่ขยายภายในเครื่องหมายคำพูดคู่เนื่องจากคุณไม่ได้ใช้งานบรรทัดยักษ์ที่ยกมาเป็นคำสั่งเดียว


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

รับ 4 บรรทัดเหล่านี้:

echo
ls
foo
bar

การวางตามที่ฉันแนะนำจะส่งผลให้เกิดสิ่งนี้บนหน้าจอของคุณ:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

จากนั้นคุณสามารถกด control-C และลูกศรขึ้น (ตัวควบคุม - C จะทำลายทุกอย่างในบรรทัดเดียวกับเคอร์เซอร์ดังนั้นให้กดย้อนกลับก่อนหากมีข้อความที่เป็นประโยชน์อยู่ที่นั่น)

อีกทางเลือกหนึ่งคือปิดใบเสนอราคาและกดปุ่มย้อนกลับจากนั้นลูกศรขึ้นที่

อย่างไรก็ตามหลังจากลูกศรขึ้น

$ 'echo
ls
foo
bar

'การควบคุมและลบชั้นนำ ใช้ control-left และ control-right เพื่อเลื่อนผ่านบล็อกวางอย่างรวดเร็ว (โดยคำ) หรือถ้าการตั้งค่าเทอร์มินัลของคุณไม่รองรับ control-arrow-keys, alt-b และ alt-f


บรรทัดใหม่ที่แท้จริงทำแยกออกคำสั่งจริงและสิ่งเหล่านี้ 4 สายจะเข้าไปในประวัติคำสั่งของคุณต่างหาก คุณอาจต้องการที่จะเปลี่ยนให้พวกเขาหรือ; &&(ฉันไม่รู้เคล็ดลับสำหรับสิ่งนั้นเพียงใช้คีย์ซ้ำสำหรับไปข้างหน้าหรือข้างหลังคำเพื่อไปที่นั่นอย่างรวดเร็วและทำด้วยตนเอง)


2

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

ฉันมักจะให้ความสนใจเป็นพิเศษเมื่อทำการคัดลอกที่ไม่รวมบรรทัดใหม่ แต่มีเคล็ดลับที่คุณสามารถลอง: ก่อนวางในทุบตีพิมพ์สิ่งC-x C-eต่อไปนี้ มันควรเปิดตัว$EDITORด้วยไฟล์ว่างเปล่า สิ่งที่คุณบันทึกไว้ในไฟล์นั้นและออก, bash จะทำงาน ดังนั้นตอนนี้คุณสามารถวางคำสั่งของคุณไปที่เครื่องมือแก้ไขอาจจัดการสิ่งต่าง ๆ เพิ่มเติมและเรียกใช้พวกเขาทั้งหมดในครั้งเดียว


-1

ฉันไม่ได้เกี่ยวข้องกับ บริษัท ฉันเป็นลูกค้าที่พึงพอใจมาก ลองนี้โปรแกรมมินัล: http://www.emtec.com/zoc/index.html นอกจากนี้ยังมีเวอร์ชั่นสำหรับ Mac

หากฉันละเมิดกฎ SE ใด ๆ โปรดแจ้งให้เราทราบและฉันจะลบคำตอบ

แก้ไข:

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

ปรับปรุง:

Paste without final 'newline'โปรแกรมมินัลมีตัวเลือก อาจเป็นสิ่งนี้ช่วย


3
อย่างน้อยโปรดพูดว่ามันตอบคำถามได้อย่างไร
Stéphane Chazelas

หากคุณวางสตริงที่มีอักขระขึ้นบรรทัดใหม่หรือ carriage-return ที่พร้อมต์ของเชลล์ที่รันในเทอร์มินัลนั้นจะเกิดอะไรขึ้น ถ้ามันไม่ทำให้เชลล์รันคำสั่งทันที (ตามที่ถามที่นี่) มันจะทำยังไง? มันลบตัวละครเหล่านั้นออกจากการเลือกหรือไม่? มันแทรกตัวละคร ^ V ก่อนที่จะหลบหนีเพื่อทุบตีหรือไม่?
Stéphane Chazelas

2
ดังนั้นดูเหมือนว่าจะเป็นสแปม (แต่ฉันแน่ใจว่าคุณไม่ได้ตั้งใจจะสแปมเว็บไซต์นี้) ไม่ตอบคำถามและเป็นเพียงโฆษณาผลิตภัณฑ์เชิงพาณิชย์ที่เกี่ยวข้อง
Stéphane Chazelas

2
@AlBundy พบว่าชื่นชอบแก้ลูกค้า terminal ของคุณปัญหานี้โดยการพยายามออกหาประโยชน์ที่กล่าวถึงในsecurity.stackexchange.com/q/39118 (ดังกล่าวในคำตอบของสเตฟาน) และการเชื่อมโยงที่คุณจะพบว่ามี หากมันช่วยปกป้องคุณคุณมีเหตุผลที่จะแนะนำ (ให้รายละเอียดการทดสอบของคุณในคำตอบของคุณ)
อเล็กซิส

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