`top -n1 |'을 실행하면 커서가 사라집니다.

`top -n1 |'을 실행하면 커서가 사라집니다.

달리는 동안

top -n1 | head

터미널의 커서가 사라집니다. 달리면 top -n1다시 돌아올 것입니다.

gnome-terminaltilixUbuntu 16.04 및 CentOS 7.5에서 테스트되었습니다 .


이 문제 없이 실행하면 출력 끝 부분에 커서가 다시 나타나게 되는 것 top -n1 | tail같은데 , 이는 인쇄할 때만 발생하지 않습니다 .tophead

원인은 무엇이며 커서를 보다 적절하게 복원하는 방법은 무엇입니까?

답변1

IMHO, 가장 좋은 방법은 다른 프로그램이나 파일에 대한 파이프와 같은 비대화형 사용 사례에 사용하도록 설계된 top"배치" 모드(플래그)를 사용하는 것입니다.-b

그래서 이거

top -n1 -b | head

커서 없이는 쉘을 떠나지 않습니다.

에 관해서는커서가 사라진 이유는 무엇입니까?...

top대화형 프로그램이기 때문에 입력을 받고 항목을 스크롤하는 등의 작업을 수행하기 위해 터미널을 "어수선하게" 만듭니다.숨다커서.

종료되면 호출되기 전에 발견된 커서 및 표시 상태를 복원해야 하며, 하나 이상의제어 코드터미널 자체에.

명령을 파이핑하면 head이 제어 코드는 실패합니다( head기본적으로 처음 10줄만 인쇄되고 두 출력 top및 터미널 상태를 복원하기 위한 제어 코드는 항상 > 10줄입니다).

실제로 head인쇄하기에 충분한 줄을 제공하면 커서가 나타납니다!

예를 들어,

top -n1 | head -n 100

내 시스템에 커서가 남아 있습니다.

답변2

이 동작을 모든 곳에서 재현할 수는 없지만 Ubuntu 18.04에서는 발생합니다.


최상위 출력의 16진수 덤프를 검사하는 것이 좋습니다.

$ 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 이스케이프 시퀀스, 이는 실제로 커서 위치 및 텍스트 색상과 같은 항목을 제어하는 ​​메타데이터입니다.

특히, 최상위 출력의 첫 번째 줄 시작 부분에 가 있고 ESC [?25l, 마지막 줄 끝에 가 있습니다 ESC [?25h. Wikipedia 페이지에 따르면 이는 커서를 숨기고 표시하는 데 해당하는 코드입니다.

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

관련 정보