เคอร์เซอร์หายไปเมื่อใช้งาน `top -n1 | head`


11

เมื่อวิ่ง

top -n1 | head

เคอร์เซอร์ของเทอร์มินัลจะหายไป วิ่งtop -n1นำมันกลับมา

ทดสอบในgnome-terminalและtilixใน Ubuntu 16.04 และ CentOS 7.5


การทำงานtop -n1 | tailไม่มีปัญหานี้ดังนั้นฉันจึงคิดว่ามีบางอย่างที่ส่วนท้ายของtopผลลัพธ์ให้เคอร์เซอร์ปรากฏขึ้นอีกครั้งซึ่งไม่ได้ถูกเรียกใช้งานเมื่อทำการพิมพ์headเพียงอย่างเดียว

อะไรทำให้เกิดสิ่งนี้และฉันจะกลับเคอร์เซอร์ได้อย่างสวยงามยิ่งขึ้นได้อย่างไร


1
tput cnormฉันยังสามารถได้รับมันกลับมาพร้อมกับการทำงาน ( ผ่าน )
pLumo

คำตอบ:


5

ฉันไม่สามารถสร้างพฤติกรรมนี้ได้ทุกที่ แต่มันปรากฏบน Ubuntu 18.04


มันเป็นคำแนะนำในการตรวจสอบการทิ้งฐานสิบหกของการส่งออกด้านบน:

$ top -n1 | head -n1 | xxd
00000000: 1b5b 3f31 681b 3d1b 5b3f 3235 6c1b 5b48  .[?1h.=.[?25l.[H
00000010: 1b5b 324a 1b28 421b 5b6d 746f 7020 2d20  .[2J.(B.[mtop - 
00000020: 3133 3a34 333a 3034 2075 7020 3120 6d69  13:43:04 up 1 mi
00000030: 6e2c 2020 3120 7573 6572 2c20 206c 6f61  n,  1 user,  loa
00000040: 6420 6176 6572 6167 653a 2030 2e38 312c  d average: 0.81,
00000050: 2030 2e35 342c 2030 2e32 321b 2842 1b5b   0.54, 0.22.(B.[
00000060: 6d1b 5b33 393b 3439 6d1b 2842 1b5b 6d1b  m.[39;49m.(B.[m.
00000070: 5b33 393b 3439 6d1b 5b4b 0a              [39;49m.[K.
$ top -n1 | tail -n1 | xxd
00000000: 1b5b 3f31 326c 1b5b 3f32 3568 1b5b 4b    .[?12l.[?25h.[K
$ 

โดยเฉพาะอย่างยิ่งลำดับที่เริ่มต้น0x1b5b3fคือANSI escape sequencesซึ่งมีประสิทธิภาพคือ meta-data เพื่อควบคุมสิ่งต่าง ๆ เช่นตำแหน่งเคอร์เซอร์และสีข้อความ

โดยเฉพาะอย่างยิ่งต่อการเริ่มต้นของบรรทัดแรกของการส่งออกด้านบนมีและต่อท้ายของบรรทัดสุดท้ายคือESC [?25l ESC [?25hตามหน้าวิกิพีเดียนี่เป็นรหัสที่เกี่ยวข้องเพื่อซ่อนและแสดงเคอร์เซอร์

โดยการไพพ์top -n1เอาต์พุตไปheadยังเทอร์มินัลจะได้รับคำสั่ง hide-cursor ในตอนเริ่มต้น แต่ไม่ใช่คำสั่ง show-cursor ที่ท้ายดังนั้นเคอร์เซอร์จะยังคงมองไม่เห็นจนกว่าการกระทำอื่นจะเปิดอีกครั้ง

@MrShunz ข้อเสนอแนะเพื่อใช้-bตัวเลือกที่topถูกต้อง ตัวเลือกนี้จะปิดการใช้งานลำดับการหลีกทั้งหมดของ ANSI ในเอาต์พุตของด้านบนแทนการแสดงผลข้อความธรรมดา ASCII ที่พิมพ์ได้ เคอร์เซอร์จะไม่ได้รับอันตรายระหว่างการดำเนินการtopกับ-b:

$ top -b -n1 | head -n1 | xxd
00000000: 746f 7020 2d20 3133 3a35 393a 3236 2075  top - 13:59:26 u
00000010: 7020 3138 206d 696e 2c20 2031 2075 7365  p 18 min,  1 use
00000020: 722c 2020 6c6f 6164 2061 7665 7261 6765  r,  load average
00000030: 3a20 302e 3134 2c20 302e 3036 2c20 302e  : 0.14, 0.06, 0.
00000040: 3037 0a                                  07.
$ 

คำตอบที่ดีขอบคุณ พฤติกรรมสามารถทำซ้ำได้ด้วยprintf \\033[?25lการซ่อนและprintf \\033[?25hเปิดเผยเคอร์เซอร์อีกครั้ง ลำดับ escape อื่น[Hและ[2Jเคลียร์เทอร์มินัล (เปรียบเทียบclear | xxd)
pLumo

17

วิธีที่ดีที่สุด IMHO คือการtopใช้โหมด "แบทช์" ( -bแฟล็ก) ซึ่งมีวัตถุประสงค์เพื่อใช้กับกรณีการใช้งานที่ไม่ต้องมีการโต้ตอบเช่นการไพพ์ไปยังโปรแกรมอื่นหรือไปยังไฟล์

ดังนั้นสิ่งนี้

top -n1 -b | head

จะไม่ออกจากเปลือกโดยไม่มีเคอร์เซอร์

สำหรับสาเหตุที่เคอร์เซอร์หายไป ...

เนื่องจากtopเป็นโปรแกรมแบบอินเทอร์แอคทีฟมัน "ยุ่งเหยิง" กับเทอร์มินัลเพื่อคว้าอินพุตเลื่อนเนื้อหา ฯลฯ และมันซ่อนเคอร์เซอร์

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

โดยการไพพ์คำสั่งผ่านheadโค้ดควบคุมนี้จะไม่ผ่าน ( headพิมพ์เพียง 10 บรรทัดแรกโดยค่าเริ่มต้นและเอาต์พุตของทั้งคู่topและรหัสควบคุมเพื่อเรียกคืนสถานะเทอร์มินัลคือ> 10 บรรทัด)

ในความเป็นจริงถ้าคุณให้headสายมากพอที่จะพิมพ์

ตัวอย่างเช่น,

top -n1 | head -n 100

ออกจากเคอร์เซอร์บนระบบของฉัน


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