이것은 명령의 출력입니다 clear...

이것은 명령의 출력입니다 clear...

새로 설치된 Debian 시스템에서 ssh를 통해 /dev/pts/0에 로그인하고 다음 명령을 입력했습니다.

watch -n 10 clear > /dev/pts/0 ; netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0

내가 얻는 것은 다음과 같습니다

Every 10.0s: clear                                              Thu Jan 30 17:42:01 2020

^[3;J^[H^[2J

이 리눅스 박스는 왜 나를 싫어하는 걸까요? ? ?

답변1

이것은 명령의 출력입니다 clear...

당신은 도망갔습니다 clear. clear이러한 제어 시퀀스를 생성합니다. (내 컴퓨터에서는 순서가 다릅니다.)

% 클리어|cat -v;echo
^[[2J^[[H^[[3J
%

ECMA-48 터미널 또는 터미널 에뮬레이터에서 이러한 제어 시퀀스는 디스플레이를 지우고 커서 위치를 지정합니다.

% 클리어 | 콘솔 디코드 ECMA48
ED 2
컵 0
ED 3
%

그러나 이 watch명령은 실행되는 프로세스의 표준 출력을 해석하며 하나만 제외하고 ECMA-48 제어 시퀀스를 이해하지 못합니다. 1968년의 일부 TTY-37 제어 문자와 ( -c이 플래그가 사용되는 경우) ECMA-48의 SGR 제어 시퀀스만 이해합니다.

ncurses에 전달되는 모든 항목은 캐럿 표기법으로 제어 문자를 인쇄합니다. 하지만실수 때문에watch이면 캐럿 문자열의 두 번째 문자가 즉시 덮어쓰여지고 표시되어야 하는 내용은 in 의 출력 ^[[과 동일합니다 .^[watch

...그리고 clear주문만 합니다.

쉘 스크립트는 전혀 인용되지 않습니다.

watch -n 10 지우기 > /dev/pts/0; netstat -tupn 2>/dev/null | netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0

따라서 두 가지 순차적 파이프라인은 다음과 같습니다.

시계 -n 10 지우기 > /dev/pts/0
netstat -tupn 2>/dev/null | netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0

리디렉션은 명령이 실행되기 전에 발생하며, 두 경우 모두 표준 출력을 열리는 의사 터미널로 리디렉션합니다.그래도. 사실상 no-ops입니다.

시계 -n 10 지우기
netstat -tupn 2>/dev/null | netstat -tupn 2>/dev/null | grep -v 3306

귀하의 기계는 귀하가 지시한 대로 정확하게 작동하고 있습니다.

따라서 명령의 출력을 계속해서 보고 있으며 clear해당 출력은 제어 시퀀스로 처리되지 않고 깨진 캐럿 표기법으로만 인쇄됩니다.

명령을 한 번 watch실행하려면 종료하세요 . netstat

관련 정보