Con trỏ biến mất khi chạy `top -n1 | đầu


11

Khi chạy

top -n1 | head

con trỏ của thiết bị đầu cuối biến mất. Chạy top -n1mang nó trở lại.

Đã thử nghiệm trong gnome-terminaltilixtrong Ubuntu 16.04 và CentOS 7.5.


Chạy top -n1 | tailkhông có vấn đề này, vì vậy tôi nghĩ, một cái gì đó ở cuối topđầu ra cho phép con trỏ xuất hiện lại mà không được thực thi khi chỉ in head.

Điều gì gây ra điều này và làm thế nào tôi có thể lấy lại con trỏ một cách thanh lịch hơn?


1
Tôi cũng có thể lấy lại nó bằng cách chạy tput cnorm. ( thông qua )
pLumo

Câu trả lời:


5

Tôi không thể tạo lại hành vi này ở mọi nơi, nhưng nó xuất hiện trên Ubuntu 18.04


Đó là hướng dẫn để kiểm tra các bãi chứa hex của đầu ra hàng đầu:

$ 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
$ 

Cụ thể, các chuỗi bắt đầu 0x1b5b3fcác chuỗi thoát ANSI , có hiệu quả là siêu dữ liệu để kiểm soát những thứ như vị trí con trỏ và màu văn bản.

Cụ thể, về phía bắt đầu của dòng đầu tiên đầu ra, có ESC [?25l, và về cuối của dòng cuối cùng là ESC [?25h. Theo trang wikipedia, đây là các mã tương ứng để ẩn và hiển thị con trỏ.

Bằng cách dẫn top -n1đầu ra đến head, thiết bị đầu cuối sẽ nhận được lệnh ẩn con trỏ khi bắt đầu, nhưng không phải là lệnh show-con trỏ ở cuối và do đó con trỏ sẽ ẩn đi cho đến khi một số hành động khác bật lại.

@MrShunz đề nghị sử dụng -btùy chọn để bật topngay. Tùy chọn này vô hiệu hóa tất cả các chuỗi thoát ANSI ở đầu ra trên cùng, thay vào đó chỉ xuất ra văn bản có thể in ASCII đơn giản. Không có con trỏ sẽ bị tổn hại trong quá trình thực thi topvới -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.
$ 

Câu trả lời tuyệt vời, cảm ơn. Hành vi có thể được sao chép printf \\033[?25lđể ẩn và printf \\033[?25hđể lộ con trỏ một lần nữa. Các chuỗi thoát khác [H[2Jxóa thiết bị đầu cuối (so sánh clear | xxd)
pLumo

18

Cách tốt nhất IMHO là topsử dụng chế độ "bó" ( -bcờ) được sử dụng cho các trường hợp sử dụng không tương tác, chẳng hạn như chuyển sang chương trình khác hoặc vào một tệp.

Vì vậy, cái này

top -n1 -b | head

sẽ không rời khỏi vỏ mà không có con trỏ.

Về lý do tại sao con trỏ biến mất ...

toplà một chương trình tương tác, nó "gây rối" với thiết bị đầu cuối để lấy đầu vào, cuộn nội dung, v.v. và nó ẩn con trỏ.

Khi chấm dứt, nó phải khôi phục con trỏ và trạng thái hiển thị mà nó tìm thấy trước khi được gọi và nó làm như vậy bằng cách gửi một hoặc nhiều mã điều khiển đến chính thiết bị đầu cuối.

Bằng cách chuyển lệnh qua head, mã điều khiển này sẽ không được thông qua ( headchỉ in 10 dòng đầu tiên theo mặc định và đầu ra của cả hai topvà mã điều khiển để khôi phục trạng thái đầu cuối luôn> 10 dòng).

Trong thực tế, nếu bạn cho headđủ dòng để in, con trỏ sẽ xuất hiện!

Ví dụ,

top -n1 | head -n 100

để lại một con trỏ trên hệ thống của tôi.


Cảm ơn rất nhiều cho câu trả lời của bạn. Sử dụng -blà cách để đi cho tôi.
pLumo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.