Linux의 clear와 Mac의 clear는 다르다

최근 CSI Sequence에 대한 글을 열심히 쓰고 있지만, 우리가 직접 CSI Sequence를 직접 사용할 일은 거의 없다. 하지만 알게 모르게 사용하는 CSI sequence가 있다. 바로 화면을 지우는 데 사용되는 clear라는 명령어다.

clear는 기본적으로 두 가지 종류의 CSI sequence를 사용한다. 하나는 CUrsor Position(a.k.a CUP; CSI H)다. 이것을 이용해 커서를 화면의 시작으로 돌린다. clear를 하고 나면, 최상단 왼쪽으로 커서가 움직이는 것은 CUP 덕분이다. 두 번째 CSI sequence는 Erase in Display(a.k.a. ED; CSI 2 J)다. 이를 이용해 화면 전체를 지운다. 여기까지는 Linux와 Mac이 공유하는 동작이다. 하지만 이후 동작에서 Linux의 clear와 Mac의 clear는 다르게 동작한다.

간단하게 말하면 Linux의 clear는 스크롤 버퍼를 지우고, Mac의 clear는 지우지 않는다. 이는 Linux의 clear는 앞의 두 시퀀스에 이어 CSI 3 J를 출력하기 때문이다. CSI 3 Jxterm이 도입한 Escape Sequence의 확장으로 스크롤 버퍼에 저장된 라인을 지우는 시퀀스다. 2011년 레드 햇 진영에서 E3라고 이름붙인 뒤로 터미널 에뮬레이터에서는 E3 확장이라고 부르기도 한다. Mac의 clear는 이 시퀀스를 출력하지 않기 때문에 스크롤 버퍼를 남겨둔다.

이런 차이가 발생한 것은 생각보다 오래된 일은 아니다. 원래 대부분의 터미널 에뮬레이터들은 E3 확장을 비롯한 xterm 확장들을 이해하지 못했다. 당연히 이 시절에는 Linux에서 사용되던 clear 커맨드도 E3를 사용하지 않았기 때문에 스크롤 버퍼는 지우지 않았다. 하지만 시간이 지나며 점점 xterm 확장은 다른 터미널 에뮬레이터로 전해져오며 E3도 구현되기 시작했다. 2007년 PuTTY, 2011년 Red Hat, 2014년 Gnome 터미널iTerm2까지 다양한 터미널 에뮬레이터들이 CSI 3 J를 지원하기 시작했고, 오늘날 대부분의 터미널은 E3 확장을 지원한다..

터미널 에뮬레이터들이 E3 확장을 지원하기 시작하자 다른 논의가 생겼다. clear의 동작을 무엇으로 보아야 할 것인가 하는 것이었다. clear는 말 그대로 화면을 지운다. 그래서 당시에는 스크롤 버퍼를 지우기 위해서는 reset이라는 명령어를 이용해야 했다. 스크롤 버퍼를 지우는 것은 터미널의 상태를 초기화시키는 reset에게 맡기고 clear는 보이는 화면만 지우자는 사람과, 터미널에서는 스크롤도 화면의 연장이기 때문에 clear는 스크롤 버퍼도 지우는 것이 자연스럽다는 사람으로 의견이 나뉘었다. 그리고 Linux 진영에서 이긴 것은 후자였다. 결국 clear 명령어에는 E3 확장이 들어갔고, 이게 싫은 사람은 clear -x를 사용해야 했다.

하지만 Mac 진영에는 이런 변화가 아직 전파되지 않았다. 아무리 찾아봐도 이와 관련된 논의조차 안 나오는 것 같다. 그래서 Mac의 clear는 E3 확장이 들어가기 전 프로그램이 쓰인다. 심지어 선택할 수 있는 옵션조차 없다. 그래서 Mac에서 Linux의 clear 같은 동작을 원하면 alias clear='printf "\033[H\033[2J\033[3J"'같은 식으로 alias를 만들어줘야 한다. 반대로 Linux에서 기존의 clear와 같은 동작을 원하면 alias clear=clear -xalias clear='printf "\033[H\033[2J"'같은 alias를 걸어줘야 한다.

댓글

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

RAII는 무엇인가

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API