!["-bash: 경고: setlocale: LC_ALL: 로케일을 변경할 수 없습니다(en_US.UTF-8)"](https://linux55.com/image/90155/%22-bash%3A%20%EA%B2%BD%EA%B3%A0%3A%20setlocale%3A%20LC_ALL%3A%20%EB%A1%9C%EC%BC%80%EC%9D%BC%EC%9D%84%20%EB%B3%80%EA%B2%BD%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4(en_US.UTF-8)%22.png)
새로운 Ubuntu 16.04 및 Debian 8 서버를 실행합니다. SSH를 통해 연결을 시도했는데 다음과 같은 이상한 터미널 출력이 발생했습니다. 나는 그 안에 숫자가 들어 있는 직사각형을 언급하고 있습니다.
언어 설정 문제는 방금 언급한 문제를 해결하려고 노력하는 동안 코딩 문제로 인한 것이라고 생각했기 때문에 스스로 도입했습니다. 3시간 동안 디버깅을 한 후에 여러분의 도움이 필요합니다!
아마도 도서관이 없어진 것 뿐일까요? 이런 그래픽 문제는 찾아보기 힘드네요...
local@local:~$ ssh dummy@server
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jul 9 17:22:43 2016 from x590c3909.dyn.telefonica.de
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
]1337;RemoteHost=dummy@server]1337;CurrentDir=/home/patrick]1337;ShellIntegrationVersion=2;shell=bash]133;C;]133;D;0]1337;RemoteHost=dummy@server]1337;CurrentDir=/home/patrick]133;Adummy@server:~$ ]133;B
에코 $PS1 출력:
echo $PS1
]133;C;\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
에코 $TERM 출력:
echo $TERM
]133;C;xterm
편집: "로케일" - 경고이 답변.
답변1
당신의 터미널은 무엇을 하고 있나요?
"숫자가 있는 직사각형"은 터미널 에뮬레이터가 시퀀스를 인식하지 못하기 때문에 터미널 제어 시퀀스를 표시하는 방법입니다. 구체적으로:
- ECMA-48 제어 문자(그룹 C1, 기술용)가 있습니다.운영 체제 명령, 줄여서 OSC라고 합니다. 유니코드 값은 U+009D입니다.
- ECMA-48은 C1 그룹의 문자가 전송을 위해 완전히 깨끗한 8비트 통신 경로를 요구하는 메커니즘을 정의하며, 이는 U+0080(128)보다 작은 값을 가진 문자에 대해 이스케이프 시퀀스만 사용하여 표현할 수 있습니다. 이것들7자리 별칭8비트가 아닌 클린 전송 경로에서는 C1 제어 문자가 허용됩니다. 아이러니하게도 세상은 수십 년 동안 대체로 8비트로 깨끗했습니다.
매우 일반적인 7비트 별칭 중 하나인
[
CSI 제어 문자(U+009B) 대신 ESC를 알고 있을 것입니다. OSC 제어 문자에는]
7비트 별칭으로 ESC가 있습니다. - SSH 연결의 원격 측에 있는 무언가는 터미널이 OSC로 시작하는 제어 시퀀스를 이해하기를 기대합니다. 7비트 별칭을 사용하여 전송합니다.
- 귀하의 터미널은 ECMA-48을 완벽하게 구현하지 않습니다. ESC를 보고
]
ESC 문자 뒤에 하나의]
문자가 오는 것으로 처리합니다. 이것이 인쇄되는 것입니다. - 하지만 ESC 문자에 대한 문자 모양은 없습니다. 따라서 문자 모양 없이 문자를 유니코드 코드 포인트(최하위 16비트)의 16진수 값이 포함된 상자로 표시하는 전통적인 방법으로 돌아갑니다. 자세히 살펴보면 상자에 숫자
00
와 ESC 문자의 코드 포인트인 U+001B가 표시됩니다.1B
- 또한 ESC에 대해 인쇄된 "간격", 즉 화면에서 차지하는 공간을 제대로 처리하지 못합니다.둘문자 너비. 그래서 상자를 인쇄한 후에는 위치를 미리 출력하지 않습니다.충분한. 그런 다음
]
보시다시피 상자의 오른쪽 절반 상단을 인쇄합니다 .
왜 이런 일을 하라고 합니까?
일부 터미널 에뮬레이터는 OSC를 제어 문자 시퀀스 소개자로 인식합니다. 표준 양식도 있습니다. ECMA-48 § 5.6은 OSC로 시작하고 ST(U+009C,문자열 종결자). 무엇인가요존재하다제어 문자열은 터미널 유형에 따라 다릅니다. 예를 들면 다음과 같습니다. xterm의 doco에서 글꼴 및 창 제목 설정을 위한 제어 문자열을 구현하는 것을 볼 수 있습니다.
하지만, 그형태이 경우 제어 시퀀스는 xterm 제어 시퀀스가 아닙니다. 그와는 반대로,
␛]1337;현재디렉토리=/home/Patrick␇
이는 iTerm2가 이해하는 OSC 제어 시퀀스의 형태입니다. iTerm2는 OSC에서 도입한 제어 시퀀스 세트를 정의하며 이는 상당히 비표준적이고 iTerm2와 다릅니다. 이는 ECMA-48 제어 문자열 사양을 따르지 않고 표준에 지정된 대로 ST를 사용하는 대신 BEL(U+0007)을 사용하여 제어 문자열을 종료합니다. 엄밀히 말하면 제어 문자열이다.종료된 적이 없음, 제어 문자열의 내용에는 SOS 및 ST를 제외한 모든 문자가 허용되며 일관된 터미널 에뮬레이터를 사용하여 표시를 효과적으로 중지하는 방법입니다. 터미널은 단순히 모든 추가 출력을 제어 문자열로 누적하기 때문입니다.
(Linux 커널에 내장된 터미널 에뮬레이터도 표준 OSC 제어 문자열을 구현하지 않습니다. xterm doco에서는 비호환 Linux 커널 터미널 에뮬레이터 또는 iTerm2 형식을 사용하여 손상된 응용 프로그램을 지원할 수 있다고 명시합니다. 여기서 형식은 확실히 iTerm2 입니다. Linux 커널 터미널 에뮬레이터가 아님).
Macintosh에서 iTerm2를 사용하는 경우 SSH 연결의 다른 쪽 끝에 있는 것은 무엇이든 조용히 iTerm2 제어 시퀀스를 터미널 에뮬레이터로 보내 쉘이 무엇인지, 작업 디렉터리가 무엇인지, 사용자가 누구인지, 다음과 같은 정보를 알려줍니다. 언제 실행할지. 명령 실행을 시작하면 쉘 프롬프트에서 편집을 시작할 수 있습니다.
당신이 가지고있는 원격 시스템에서하드와이어 터미널 유형. 항상 iTerm2를 사용하여 대화한다는 가정하에 실행했습니다. 하지만 너는지금Ubuntu에서 실행되는 Terminator를 사용하여 대화하세요.다른터미널 에뮬레이터에는다른제어 순서가 설정되었습니다.
실제로 출력에서는 다음과 같은 내용도 알려줍니다.
␛]1337;ShellIntegrationVersion=2;shell=bash␇
원격 시스템에 Bourne Again 쉘용 iTerm2 "Shell Integration"을 설치했습니다. 보세요, iTerm2가 실제로 대화 중인 터미널인지 확인하는 것은 끔찍합니다.
따라서 비활성화/제거하십시오.
추가 읽기
- 문자 세트 인코딩을 위한 제어 기능. ECMA-48. ECMA 인터내셔널.
console_codes
. 리눅스 매뉴얼 페이지. § 4.2015.- 매튜 프리먼, 조지 나크먼, 제임스 A. 로젠. 독점 이스케이프 코드. iTerm2 문서.
- 매튜 프리먼, 조지 나크먼, 제임스 A. 로젠. 주택 통합. iTerm2 문서.
답변2
다음과 같은 ssh
다른 접두사 명령을 사용해 보십시오 .LC_ALL
LC_ALL=C ssh dummy@server