'ls name'과 'ls | grep name'의 악센트가 다릅니다.

'ls name'과 'ls | grep name'의 악센트가 다릅니다.

저는 Xigmanas(NAS freebsd)를 사용하고 있습니다. 상황을 최대한 간단하게 설명하겠습니다.

:;  set | egrep 'LC_A|LANG'
GDM_LANG=fr_FR.UTF-8
LANG=fr_FR.UTF-8
LC_ALL=fr_FR.UTF-8
SLIM_LANG=fr_FR.UTF-8

:;  ls -i  1989* ; ls -i | grep 1989 ;  ls -ib  1989* ; ls -ib | grep 1989
9920 1989 Amn??sia.mp4
 9920 1989 Amnésia.mp4
9920 1989 Amn\303\251sia.mp4
 9920 1989 Amn\303\251sia.mp4

ls이는 악센트만 ??로 변환된 다음 채널을 차지하는 경우가 아닙니다 grep.

파이프는 특히 스트림을 수정하여 바이트 스트림을 수정해서는 안 되기 때문에 설명이 보이지 않습니다!

ls후속 grep표시는 정확하지만 ls개별 표시는 올바르지 않습니다.

어떻게 되어가나요?

답변1

이것은 작동합니다:

ls --show-control-chars A*
Amnésia

이것과 동일합니다.

ls A* | cat
Amnésia

ls내 버전의 데비안() 문서에 ls (GNU coreutils) 8.32따르면,

--show-control-chars그래픽이 아닌 문자를 있는 그대로 표시합니다([...] 출력이 터미널이 아닌 경우 기본값)

é\303\251UTF-8 로케일에 표시된 2바이트( )는 그래픽이 아닌 문자가 아닌 인쇄된 문자로 처리되어야 하기 때문에 이는 버그일 수 있습니다 .


이제는 재현할 수 없습니다. export로케일 변수가 있습니까 ? 이 명령에서 일련의 결과를 얻어야 합니다.

env | egrep 'LC_A|LANG'

그렇지 않은 경우 export환경에 로케일 변수를 추가해 보십시오.

eval $(LC_ALL=fr_FR.UTF-8 locale | sed 's/^/export /' )

그런 다음 다시 시도해 보세요.

ls A*
Amnésia

관련 정보