bash가 악센트 부호가있는 문자를 처리하는 방식에서 일부 이상이 발생했다고 생각합니다. 팝콘을 잡아야 할 수도 있습니다. 왜냐하면 약간의 기술적 인 점이 있기 때문입니다 ...
유니 코드를 사용하면 악센트 부호가있는 문자를 몇 가지 다른 방식으로 나타낼 수 있습니다. 악센트 부호가있는 문자를 나타내는 "코드 포인트"또는 악센트가없는 문자 버전을 나타내는 일련의 코드 포인트와 그 뒤에 악센트가 있습니다. 예를 들어, "ä"는 U + 00E4 (UTF-8 0xc3a4, 분음 부호가있는 라틴어 소문자 1)로 미리 구성되거나 U + 0061 U + 0308 (UTF-8 0x61cc88, 라틴어 소문자 a + 결합 분음 부호)로 표시 될 수 있습니다. ).
OS X의 HFS + 파일 시스템에서는 모든 파일 이름을 완전히 분해 된 형식 의 UTF-8 표현으로 저장해야합니다 . HFS + 파일 이름에서 "ä"는 0x61cc88로 인코딩되어야하고 "ö"는 0x6fcc88로 인코딩되어야합니다.
여기서 일어나는 일은 명령 줄에 "Näyttökuva.png"를 입력하면 미리 작성된 형식으로 문자를 "입력"한다는 것입니다. 파일이 작성되면 파일 시스템은 저장 문자를 분해합니다. 지금까지 모든 것이 정상입니다. 그러나 "Nä"로 시작하는 탭 완성을 사용하려고하면 bash가 일치하는 항목을 검색하기 전에 "ä"를 분해하지 못하며 물론 찾지 않습니다.
차이점을 설명하기 위해 명령 줄에 "Näyttökuva.png"를 입력 할 때 사용되는 인코딩과 파일 이름으로 저장하고 탭 완성을 사용하여 입력 할 때 사용되는 인코딩의 예는 다음과 같습니다.
$ printf Näyttökuva.png | xxd # This time I pasted the it in from this web page
0000000: 4ec3 a479 7474 c3b6 6b75 7661 2e70 6e67 N..ytt..kuva.png
$ touch Näyttökuva.png # Also pasted from the web
$ printf Näyttökuva.png | xxd # This time I tab-completed it after N
0000000: 4e61 cc88 7974 746f cc88 6b75 7661 2e70 Na..ytto..kuva.p
0000010: 6e67 ng
이제 삭제하고 다시 완성 할 때 문자가 손실되는 문제와 관련이 있습니다. 특히, bash는 delete 키를 누를 때마다 하나의 코드 포인트를 "삭제"하지만 터미널 창에서 하나의 문자를 지 웁니다. 삭제 된 문자 중 하나 (이번에는 "ö")가 두 개의 코드 포인트로 구성되었지만 한 문자 만 있기 때문에 터미널 디스플레이가 동기화되지 않습니다. 전체 파일 이름을 탭 완성하고 "Näytt"로 다시 삭제 한 다음 다시 완성하십시오. bash는 전체 "ö"가 아니라 결합 분음 만 삭제 된 것으로 생각하여 결합 분음을 다시 추가합니다. 하지만 이번에는 "t"에 연결됩니다.
$ echo Näytẗkuva.png
Näyttökuva.png
return 키를 누르면 bash는 실제로 전체 파일 이름을 갖습니다. 혼란스러운 터미널 디스플레이 일뿐입니다.
TL; DR bash에는 분해 가능한 악센트 문자를 처리하는 몇 가지 버그가 있습니다.
편집 : 뮬링 후, 유일한 해결책은 bash를 수정하는 것입니다 (/ 개발자가 수정하기를 기다립니다). 분해 된 형태로 문자를 입력하는 방법이있을 수도 있지만 그게 뭔지 모르겠습니다. 그러나 부분 해결 방법을 찾았습니다.
Finder에서 파일을 끌어다 놓으면 올바른 형식으로 붙여 넣습니다. Finder는 파일 시스템에서 파일 이름을 가져 오기 때문에 이미 분해되어 작동합니다.
실제로 강조 문자 자체를 탭 완성 할 수 있습니다. 예를 들어 "Na"를 입력 한 다음 탭을 사용하면 "ä"의 표준 분해가 "a"로 시작하므로 "Näyttökuva.png"와 일치합니다. 그러나 같은 디렉토리에 "Narwal.gif"라는 파일이 있다면 그다지 도움이되지 않습니다 ...
나는 이것을 테스트하지 않았지만 탭을 완료 대신 메뉴 완성에 바인딩 하면 가능한 일치 항목을 탭하여 다음 문자를 입력 할 수 없어도 원하는 것을 선택할 수 있어야합니다. 또는 다른 키 입력에 바인딩 할 수 있으므로 필요할 때만 사용할 수 있습니다.
터미널 디스플레이가 동기화 되지 않는 문제를 해결하기 위해 다시 그리기 줄에 무언가를 바인딩 할 수 있습니다 . 문제가 발생하는 것을 막지는 않지만 디스플레이를 다시 동기화하는 방법을 제공합니다.
$ echo -e "N\xC3\xA4*" | ls
(에코가주는Nä*
) 결과 사용Näyttökuva.png
. Mac OS의 다른 쉘에도 문제가 있습니다. 예를 들어 zshls N
는 다음 과 같이 자동 완성됩니다.ls Na<0308>ytto<0308>kuva.png