[apple] Bash / Terminal이 이해할 수 있도록 특수 문자를 입력하는 방법은 무엇입니까?

폴더에 파일이라는 파일이 있다고 가정 해 보겠습니다 Näyttökuva.png(관심있는 사람들을 위해 “스크린 샷”이라고 함). 이것이 일어나는 일입니다.

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

$ ls Nä*
ls: Nä*: No such file or directory

이것은 탭 자동 완성에도 영향을줍니다. 입력을 시작 ls N하고 누르면 tab올바르게 확장됩니다 ls Näyttökuva.png. 그러나 타이핑을 시작하면 ls Nä아무것도하지 않습니다.

어떻게해야합니까 :

  • 특수 문자를 이해하도록 bash / 터미널 구성
  • bash / terminal이 이해할 수 있도록 특수 문자를 입력 하시겠습니까?

터미널의 인코딩은 설정 탭에서 UTF-8로 설정되고 인코딩 탭은 기본 상태입니다. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + 일부 아시아 코딩이 가능합니다.


낯선 사람조차도 (질문에 필수적이지는 않지만) :

내가 입력하면 ls N, 키를 누릅니다 tab는 IT가 나타날 때까지 끝에서, 삭제 문자를 ls Nä누릅니다 tab다시에 명령 팽창 ls Nättökuva.png[원문].

다시 문자를 삭제하려고 시도 ls Nä하고 Tab 키를 누르면으로 확장됩니다 ls Nätökuva.png. 세 번째 실행은로 확장됩니다 ls Näökuva.png.

어떤 이유로, 4 번째 런은 ls Nä̈kuva.png움라우트보다 움라우트에 주목합니다. 탭 이동하여 ls Nä̈제공 ls Nä̈kuva.png할 때마다. 그럼에도 불구하고 작동합니다.

$ ls Nä̈kuva.png
Näyttökuva.png

$ history 2
518  ls Näyttökuva.png 
519  history 2



답변

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äytkuva.png 
Näyttökuva.png

return 키를 누르면 bash는 실제로 전체 파일 이름을 갖습니다. 혼란스러운 터미널 디스플레이 일뿐입니다.

TL; DR bash에는 분해 가능한 악센트 문자를 처리하는 몇 가지 버그가 있습니다.

편집 : 뮬링 후, 유일한 해결책은 bash를 수정하는 것입니다 (/ 개발자가 수정하기를 기다립니다). 분해 된 형태로 문자를 입력하는 방법이있을 수도 있지만 그게 뭔지 모르겠습니다. 그러나 부분 해결 방법을 찾았습니다.

  1. Finder에서 파일을 끌어다 놓으면 올바른 형식으로 붙여 넣습니다. Finder는 파일 시스템에서 파일 이름을 가져 오기 때문에 이미 분해되어 작동합니다.

  2. 실제로 강조 문자 자체를 탭 완성 할 수 있습니다. 예를 들어 “Na”를 입력 한 다음 탭을 사용하면 “ä”의 표준 분해가 “a”로 시작하므로 “Näyttökuva.png”와 일치합니다. 그러나 같은 디렉토리에 “Narwal.gif”라는 파일이 있다면 그다지 도움이되지 않습니다 …

  3. 나는 이것을 테스트하지 않았지만 탭을 완료 대신 메뉴 완성에 바인딩 하면 가능한 일치 항목을 탭하여 다음 문자를 입력 할 수 없어도 원하는 것을 선택할 수 있어야합니다. 또는 다른 키 입력에 바인딩 할 수 있으므로 필요할 때만 사용할 수 있습니다.

  4. 터미널 디스플레이가 동기화 되지 않는 문제를 해결하기 위해 다시 그리기 줄에 무언가를 바인딩 할 수 있습니다 . 문제가 발생하는 것을 막지는 않지만 디스플레이를 다시 동기화하는 방법을 제공합니다.


답변

이것은 오래된 질문이며 확실한 대답은 아닙니다. 해결 방법.

그러나 나는이 오래된 가이드의 정보를 결합하고 여기에서 제안하고 지시 한대로 :

Snow Leopard에 최신 bash를 설치했습니다. 설치 후 bash 완료가 올바르게 작동합니다! Snow Leopard는 3.2.48 (1)과 함께 제공되며 MacPorts는 4.2.45_1을 설치했습니다. 변경 /etc/shells하고 실행 하는 것을 잊지 마십시오 chsh.

또한 다른 지침으로 인해 다음과 .inputrc같습니다.

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

제대로 작동해야하는지 확실하지 않습니다.


답변

iconv 나를 위해 일한 해결책입니다.

ls `echo 'Näytẗkuva.png' | iconv -t UTF8-MAC`

참조 /programming//a/23226449/1909531를


답변