답변:
나는이 행동을 모든 곳에서 재현 할 수 없었지만 우분투 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
있습니다. 위키 백과 페이지에 따라 이들은 커서를 숨기고 표시하는 각각의 코드입니다.
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.
$
printf \\033[?25l
를 숨기고 표시하기 위해 동작을 재현 할 수 있습니다 printf \\033[?25h
. 다른 탈출 시퀀스 [H
와 [2J
터미널을 지우십시오 (비교 clear | xxd
)
IMHO의 가장 좋은 방법은 top
"배치"모드 ( -b
플래그)를 사용하는 것입니다. "배치"모드 ( 플래그)는 다른 프로그램이나 파일로 파이핑하는 것과 같은 비대화 형 사용 사례와 함께 사용하기위한 것입니다.
그래서 이건
top -n1 -b | head
커서없이 쉘을 떠나지 않을 것입니다.
에 관해서는 커서가 사라지는 이유는 ...
top
대화식 프로그램 이기 때문에 입력, 스크롤 내용 등을 잡기 위해 터미널과 "메시" 하고 커서를 숨 깁니다 .
종료시 커서와 호출하기 전에 찾은 표시 상태를 복원해야하며 하나 이상의 제어 코드 를 터미널 자체 에 전송하여이를 수행 합니다.
명령을 통해 파이핑하면 head
이 제어 코드는 통과하지 않습니다 ( head
기본적으로 처음 10 줄만 인쇄 top
하고 터미널 상태를 복원하기위한 제어 코드와 출력의 출력 은 항상> 10 줄입니다).
실제로, head
인쇄하기에 충분한 행을 제공 하면 커서가 나타납니다!
예를 들어
top -n1 | head -n 100
내 시스템에 커서를 둡니다.
-b
나를 사용 하는 방법입니다.
tput cnorm
. ( via )