zsh & bash locale 설정

문제

mac os 에서 기본 bash 를 사용하고 있었고, 원격 서버로 ssh 접속했을 때, ssh 상에서 한글 표시가 문제 없었다.

그런데 zsh 를 쓰고 원격 서버로 ssh 접속하니, 한글 표시가 문제가 되었다.

여기서 원격 서버는 bash 사용중.

작업 내용

결국 locale 설정 문제다.
mac os 에서 locale 확인:

$ locale
LANG="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_CTYPE="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_ALL=

bash -> 원격 서버 접속 후 locale 확인:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

zsh -> 원격 서버 접속 후 locale 확인:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=ko_KR.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

원격 서버에서 아래와 같이 입력하면 이슈는 해결된다.

$ sudo locale-gen "ko_KR.UTF-8"

다시 locale 확인해보면~

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=ko_KR.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

LC_CTYPE 이 ko_KR.UTF-8 로 설정되고, ssh 에서 한글 사용이 자유롭게 되는것을 볼 수 있다.

원인 분석

일단 LC_CTYPE 이게 뭔가?

gnu 정의 보면..

This category applies to classification and conversion of characters, and to multibyte and wide characters;

conversion 에 관여하는 항목이라고 보인다.

아직 정확히 파악은 안되었지만, ssh 통해서 지원하지 않는 locale 이 나타났을때 LC_CTYPE 기준으로 conversion 이 이루어진다고 보인다.

bash 는 뭔가 능숙히 터널링이 되었고, zsh 는 안되는건 안된다라고 표현한듯…