คอนโซล MySQL: Ctrl + C ทำให้ฉันบ้า


24

มีบางอย่างในคอนโซล MySQL ที่ทำให้ฉันบ้าคลั่ง เมื่อฉันกดctrl+ cเพื่อยกเลิกคำสั่งปัจจุบันที่กำลังพิมพ์เทอร์มินัลจะออก

ในทุกฉันรู้ว่าขั้ว ( *nixขั้วPython, PostgreSQL) ctrl+ cยกเลิกคำสั่งปัจจุบันและctrl+ dออกจากสถานี

ปัญหานี้ได้รับการรายงานในปี 2003และชนหลายครั้งตั้งแต่

มีวิธีการ:

  • เปลี่ยนพฤติกรรมนี้หรือ
  • โน้มน้าวใจทีม MySQL dev ว่ามันน่ารำคาญจริงๆเหรอ?

คำตอบ:


6

หากต้องการเปลี่ยนพฤติกรรมให้ดาวน์โหลดซอร์สสำหรับ mysql CLI และแก้ไขSIGINTตัวจัดการเพื่อให้ทำงานตามที่เห็นสมควรจากนั้นทำการคอมไพล์และติดตั้งใหม่


1
สิ่งนี้อาจเป็นอันตรายหรือไม่? ไม่มีการรับประกันว่าจะใช้ได้กับเวอร์ชันในอนาคต นอกจากนี้ดูเหมือนว่าจะใช้งานได้ แต่คุณจะรู้ได้อย่างไรว่าคุณจะไม่ได้รับพฤติกรรมแปลก ๆ ในสถานที่ที่ไม่เกี่ยวข้องโดยสิ้นเชิงในภายหลัง
Pacerier

21

อย่างน้อยเวอร์ชัน 5.6.14 ของไคลเอ็นต์มีตัวเลือก--sigint-ละเว้นเพื่อละเว้นตัวจัดการ SIGINT ทั้งหมด ดูเหมือนว่าจะมีการเพิ่มในวันที่ 7 ตุลาคม 2004 - ดังนั้นจึงเป็นเวลาไม่นาน ฉันเพิ่งทดสอบมันและมันจะป้องกัน CTRL-C จากการยกเลิกไคลเอนต์ MySQL อย่างไรก็ตามมันจะดีถ้า CTRL-C จะยกเลิกบัฟเฟอร์บรรทัดคำสั่งปัจจุบันเหมือนที่ทำบนเชลล์ BASH - เช่นเดียวกับ PostgreSQL CLI ฉันได้แยก MySQL เพื่อที่จะดูว่ามันยากแค่ไหนที่จะทำสิ่งนั้น ฉันจะโพสต์สูตร Homebrew พร้อมลิงก์ tarball เมื่อ / ถ้าพร้อม

อัปเดต 1 เคยมีหนึ่งในวันเหล่านั้นหรือไม่ ฉันสร้างแพตช์ที่สัญญาแล้วจากนั้นฉันตัดสินใจสร้างวิดีโอเพื่อสาธิต มันได้ผล! อย่างไรก็ตามฉันไม่สามารถปิดใช้งานได้! มันกลับกลายเป็นว่า MySQL อบจริงในการทำงานให้กับลูกค้าหลักเมื่อปีที่แล้ว ! ใช่, A ถึง Q นี้คือการดาวน์โหลดไคลเอนต์ของ MySQL 5.7.3-794-g901d27f อย่างน้อย มันมีฟังก์ชั่นที่เราทุกคนต้องการ

ตัวอย่าง จากบรรทัดคำสั่งเพียงเพิ่มแฟล็ก --sigint-ละเว้น:

mysql --host=127.0.0.1 --port=8900 --user=root -p --sigint-ignore DBNAME

หรือทำอย่างที่ฉันทำและสร้างไฟล์ MySQL config สำหรับบัญชีผู้ใช้ของคุณที่$HOME/.my.cnf( %USERPROFILE%/.my.cnfบน Windows) ด้วยเนื้อหาต่อไปนี้:

[mysql]
sigint-ignore=TRUE

สิ่งนี้จะช่วยให้มั่นใจว่าmysqlการประมวลผลทั้งหมดจะไม่สนใจ Ctrl-C ที่น่ารำคาญและทำงานเหมือนไคลเอ็นต์ SQL ที่ดี


19

ในขณะที่พฤติกรรมctrl+ cเป็นที่น่ารำคาญคุณยังสามารถใช้\cเพื่อยกเลิกการสืบค้นปัจจุบัน คุณต้องฝึกตัวเองว่าเมื่อใช้ mysql CLI คุณจะใช้\cแทนctrl+ c!


1
ใครคือคนที่คิดแบบนี้? เราต้องการหัวของเขา
Pacerier

1
นอกจากนี้คุณยังสามารถใช้ Ctrl + U เพื่อลบไปยังจุดเริ่มต้นของบรรทัดและ Ctrl + W เพื่อลบหนึ่งคำย้อนหลัง
ดาเมียนÓ Ceallaigh

9

ข่าวดี: ของ MySQL ^ ฟังก์ชั่น C ได้ในที่สุดได้รับการแก้ไขโดย# 66583

จากการเปลี่ยนแปลง5.7.0 :

ก่อนหน้านี้ Control + C ใน mysql ขัดจังหวะคำสั่งปัจจุบันหากมีอยู่หนึ่งรายการหรือออกจาก mysql ถ้าไม่ ตอนนี้ Control + C จะขัดจังหวะคำสั่งปัจจุบันหากมีหนึ่งคำสั่งหรือยกเลิกบรรทัดอินพุตบางส่วนเป็นอย่างอื่น แต่จะไม่ออก


ฉันใช้ 5.6.35 และตรวจสอบแล้วว่าไม่ใช่ปัญหา
flow2k

1

คุณใช้ไคลเอ็นต์รุ่นใด ฉันจำได้ว่านี่เป็นพฤติกรรมที่เก่ากว่า แต่เวอร์ชัน 5.1 และ 5.5 รุ่นล่าสุดดูเหมือนว่าจะยกเลิกคำสั่งที่รันอยู่โดยไม่ออกจากไคลเอ็นต์ จากนั้นอีกครั้งอาจเป็นได้ว่าฉันใช้ Percona builds อยู่ คุณสามารถลองใช้ลูกค้าของพวกเขาหากเป็นกรณีนี้


อืมฉันกำลังใช้งาน 5.5 Percona และ ctrl + c ยังยกเลิกไคลเอ็นต์ mysql (ไม่ใช่คำสั่ง sql ปัจจุบัน)
Derek Downey

ฉันคิดว่าฉันผิด OP การตอบสนองของฉันคือการระบุคำสั่งที่อยู่ระหว่างการดำเนินการไม่ใช่ความปรารถนาที่จะทำให้คุณว่างเปล่าสำหรับคำสั่งที่ยังไม่ได้เรียกใช้
atxdba

ฉันเห็นด้วยกับ @atxdba - ฉันกำลังเรียกใช้ Percona build 5.5 และ ctrl + c หลุดออกจากคำสั่งการเรียกใช้งานในปัจจุบัน หากไม่มีคำสั่งดำเนินการก็จะหลุดออกจาก CLI อาจเป็นได้ว่า ctrl + d หลุดออกจากเชลล์ที่กำลังทำงานอยู่ แต่ถ้าคุณมีสคริปต์ที่ทำงานอยู่ภายในเชลล์นั้นจะหยุดถ้าคุณกด ctrl + c ... คำสั่งต่าง ๆ สำหรับแอพ / เชลล์ / สคริปต์ที่แตกต่างกัน! อาจทำให้สับสน ... : ~ s
Dave Rix

@DaveRix ฉันเห็นด้วย ctrl + c หลุดออกจากแบบสอบถามที่กำลังดำเนินการอยู่ แต่นั่นไม่ใช่สิ่งที่โอพีเป็นเรื่องน่าเสียดาย
Derek Downey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.