`top -n1 | 머리 16.04 및 CentOS는 7.5. Running top

달릴 때

top -n1 | head

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

테스트 gnome-terminaltilix우분투 16.04 및 CentOS는 7.5.


Running top -n1 | tail에는이 문제가 없으므로 top출력 이 끝났을 때 커서가 다시 나타나서 인쇄 할 때 실행 되지 않는 것으로 생각 head합니다.

무엇이 이것의 원인이며 어떻게 커서를 더 우아하게 되돌릴 수 있습니까?



답변

나는이 행동을 모든 곳에서 재현 할 수 없었지만 우분투 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
$ 

특히, 시작하는 시퀀스 0x1b5b3fANSI 이스케이프 시퀀스 이며 커서 위치 및 텍스트 색상과 같은 것을 제어하기위한 메타 데이터입니다.

특히 상단 출력의 첫 번째 줄의 시작 ESC [?25l부분에, 마지막 줄의 끝 부분이 ESC [?25h있습니다. 위키 백과 페이지에 따라 이들은 커서를 숨기고 표시하는 각각의 코드입니다.

top -n1출력을 로 파이핑하면 head터미널은 시작시 hide-cursor 명령을 수신하지만 마지막에는 show-cursor 명령을 수신하지 않으므로 다른 조치가 다시 켜질 때까지 커서가 보이지 않습니다.

-b옵션 을 사용하는 @MrShunz 제안 top은 바로 사용할 수 있습니다 . 이 옵션은 일반 ASCII 인쇄 가능 텍스트를 출력하는 대신 상단 출력에서 ​​모든 ANSI 이스케이프 시퀀스를 비활성화합니다. 더 커서는 실행하는 동안 피해되지 않습니다 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.
$ 


답변

IMHO의 가장 좋은 방법은 top“배치”모드 ( -b플래그)를 사용하는 것입니다. “배치”모드 ( 플래그)는 다른 프로그램이나 파일로 파이핑하는 것과 같은 비대화 형 사용 사례와 함께 사용하기위한 것입니다.

그래서 이건

top -n1 -b | head

커서없이 쉘을 떠나지 않을 것입니다.

에 관해서는 커서가 사라지는 이유는

top대화식 프로그램 이기 때문에 입력, 스크롤 내용 등을 잡기 위해 터미널과 “메시” 하고 커서를 숨 깁니다 .

종료시 커서와 호출하기 전에 찾은 표시 상태를 복원해야하며 하나 이상의 제어 코드 를 터미널 자체 에 전송하여이를 수행 합니다.

명령을 통해 파이핑하면 head이 제어 코드는 통과하지 않습니다 ( head기본적으로 처음 10 줄만 인쇄 top하고 터미널 상태를 복원하기위한 제어 코드와 출력의 출력 은 항상> 10 줄입니다).

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

예를 들어

top -n1 | head -n 100

내 시스템에 커서를 둡니다.


답변