winepath 문제 돌아가기.

리눅스 세계에선 진정한 해결책보다는, 우회책(Workaround)을 쉽게 접할 수 있다. 이게 꼭 리눅스 세계에서만 이런 건 아닐테지만..


한달쯤 전부턴가? Wine 으로 프로그램을 실행하면, 뭔가 경로 문제가 계속 나타나기 시작했다. 틀림없이 얼마 전까진 잘 됐었는데..? 살펴보니 이건 winepath 의 문제였다.
그 문제를 해결하기 위해 새로운 winepath-perl.sh 를 만들기도 했다. 그냥 내가 만든 걸 써도 별 문제는 없었는데, 이유가 뭔지 궁금하여 WINE 측에 문의를 했다.

생각보다 답이 너무 빨리 나와서 놀라기도 했지만, 우회책이 또 의외라서 그것도 좀 신기했다.
간단하게 정리해본다.

비 영어권 문자가 깨지는 문제

Terminal 사용

$ wine winepath -w "/home/arch/다운로드/"                                                                             
Z:\home\arch\?ㅼ슫濡쒕뱶\

저렇게 한국어가 깨져버리는 문제가 있다. 이게 MS 윈도우와 리눅스간 코드 문제라고 하는데.. 이전까진 잘 돼 오던게 왜 갑자기 이런 결과가 나오는지는 알 길이 없으나, 해결책은 그나마 간단하다. tee 등을 써서 pipe 시켜주면 된다.

$ wine winepath -w "/home/arch/다운로드/" | tee
Z:\home\arch\다운로드\

이렇게 글자가 이상하게 깨져버리는 현상을 mojibake 라고 한다고 한다. moji 는 그렇다치고, bake 는 ‘굽다’할 때 그 bake 인가 했는데.. 알고보니 일본어 文字化け(모지바케) 에서 왔다고 한다. 하지만 윅셔너리에도, 위키피디아에도, 왜 이 단어를 쓰게 됐는지, 어원 설명은 없다.

스크립트 사용

스크립트 내에서 사용할 때는 tee 를 쓸 필요없이, 그냥 변수에 할당해주면 된다.

$ foo=$(winepath -w "<DIR>")
$ echo -E $foo

이때, 출력을 위해서는 반드시 echo -E 를 쓰는게 좋다. bash 는 echo -E 가 기본값이라곤 하지만, 그래도 안전(?)을 위해 -E 를 붙인다. zsh 에선 그냥 echo 를 했더니 echo -e 로 출력되었다.

또, 다른 곳에 쓸 때는 그냥 “$foo” 면 충분하다.

Wrapper 용

.desktop 파일에서 Exec 행에 사용할 스크립트에 winepath 를 쓸 때는, 꼭 전체 경로를 써줘야 한다. 그렇지 않으면 아무 것도 실행이 되지 않는다. 이 내용은 Eric Pouech 님이 알려주셨다.
관련 버그는 다음 2개.

위 내용을 종합하면, 다음과 같이 처리해야 오류를 막을 수 있다.

bar=$(wine 'c:\windows\syswow64\winepath.exe' -w "<DIR>")

winepath 단독 사용하거나, wine winepath 등으로 하면 아무 결과도 나오질 않는다.
반드시, wine 'c:\windows\syswow64\winepath.exe' 형식으로 명령을 작성해야 한다.


이 일을 계기로 다시 한번, ‘문제 해결 정공법’을 생각하게 됐다.
괜히 이리 저리 뒤지지 말고, 책임자에게 물어보는게 제일 빠르다. 컴퓨터 뿐만이 아니고, 어떤 문제든…

그러나 그리 하는게 결코 쉽지만은 않다는 거.. 그게 또 문제지.
아무튼 깔끔하게 해결할 수 있어서 기분은 좋네.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.