[첫화면으로]윈도우7에서Unix툴쓰기

마지막으로 [b]

윈도우7에서 Unix, Linux 용 각종 툴 사용하기

1. 개요

cat, less, diff 등 Linux에서 잘 쓰던 몇몇 터미널 명령어들을 윈도XP에서 쓰기 위해서 그동안은 UnxUtils[1]를 쓰고 있었다. 여기 있는 파일들을 특정 폴더에 두고, 그 폴더를 PATH환경 변수에 추가.

그런데 며칠 전 윈도우7 64비트 버전을 설치했더니, less를 실행하니 먹통이 되더라. 저 unxutils의 소스포지 페이지[2]에 가 봐도 윈도7에서 안 된다는 커멘트들이 있길래 그러려니 하고, 대안을 찾기로 함 (사실 less말고 다른 건 제대로 확인도 안 해봤음)

가장 필요한 건 less였는데, 그 이유는 윈도우용 Strawberry Perl에서 perldoc을 띄워 문서를 볼 때 pager로 less를 지정하면 편했기 때문. perldoc에서 기본적으로 출력해주는 건 역방향 스크롤이나 검색이 안 되어 매우 불편함. 그리고 재빨리 텍스트를 검색하기 위한 grep이나 행번호 출력을 위한 cat 등이 필요했음.

2. 떠오른 대안들

1) cygwin

제일 먼저 떠오르는 건 아무래도 cygwin[3]이었는데 (지금 생각해도 여전히 이게 제일 손쉽지 않았을까 싶음), 나는 십년전 쯤에 처음 cygwin을 설치했다가 상당히 적응을 못 해서, 괜히 꺼려졌다. 그리고 웬만하면 포팅 라이브러리를 거치지 않고 네이티브로 돌아가는 게 낫지 않을까라는 별 쓸데없는 생각도 있었고. 그래서 다른 걸 찾아봤는데...

2) msysgit

윈도에서 Git을 쓰기 위해서 설치한 Git for windows[4]에 보면 bash쉘과 함께 몇몇 툴이 같이 설치되고, 이 중에는 less나 grep도 있다. 그리고 less가 문제 없이 돌아가는 것도 확인.

그런데 이걸 쓰지 않은 이유는, 윈도우에서 작업할 때 bash 창을 띄우면 이번엔 내가 너무 헷갈린다. -_-; 리눅스에서 bash 쓰는 건 전혀 문제가 아닌데 윈도우에서 쓰려면 또 적응이 잘 안 됨. 그렇다고 msysgit 에 설치된 bin 디렉토리만 PATH에 추가하고 cmd나 ckw에서 쓰자니, 이번엔 msysgit에 포함된 perl(5.8이 깔림) 등 원하지 않는 게 덩달아 추가되어서, PATH 조정하기가 영 불편함.

3) gnuwin32

트위터에서1 알게 된 GnuWin32[5]를 살펴봤다. 보아하니 unxutils와 같은 취지인 듯 했고, 윈도우7도 명시되어 있고, 네이티브라고 하고, 그래서 얼씨구나 했는데... 프로젝트 요약 페이지[6]에서 32-bits라고 적힌 게 좀 불안했음. 그리고 또 한 가지 불편한 점은, 다운로드[7] 들어가 봤더니만 grep 따로 less 따로 diff 따로... 전부 각각 셋업 파일 받아서 설치해야 했음. (첫화면에 보면 Download All 링크가 있는데 여길 들어가보면[8] 일단 간단한 설치프로그램을 받고, 그걸 실행하면 그게 모든 패키지를 각각 다운받아서 설치해주는 모양인데, 실행했더니 다운로드 받는데 한세월이라서 중지해버렸음)

암튼 여기서 bzip2, coreutils, fileutils, grep, gzip, tar, less, wget 등등을 받아 설치해봤는데...

아뿔싸, 다른 건 멀쩡한데 less는 이것 역시 먹통이 된다

3. less 의 crash 문제

정확한 증상은, less 파일명 하면, 그 상태에서 멈춰버리고, 최종적으로 ckw 창까지 죽게 한다는 거였다. 외국에서도 질문글이 올라와 있더라[9] 여기 적힌 것과 정확히 같다.

희한한 게, 명령 프롬프트(cmd.exe)창에서는 잘 될 때도 있고 마찬가지로 죽을 때도 있다. ckw.exe 위에서는 백이면 백 죽는다.

위 글[9]에서는 less 옵션에 -X를 넣으니까 해결되었다고 했는데, 막상 내가 해보니까, 죽지는 않는데, 출력이 바로 다음 줄 한 줄에 죽 나오고 (마치 터미널 창의 크기를 조절해서 높이가 한 줄 밖에 안 되는 것처럼) 끝나 버리더라.

4. msysgit에서 일부만 빼기

결국 gnuwin32의 less를 쓰는 것도 포기하고, 잠깐 고민을 했는데(cygwin을 까는 수밖에 없나 하고ㅋ) 생각해보니까 위에 적은 msysgit의 less는 잘 돌아가고, bin디렉토리를 PATH에 추가하는 건 부담스럽다면 저 less만 따로 복사해서 쓰면 될 게 아닌가.

그래서 git설치디렉토리/bin/less.exe 파일을 PATH에 포함된 다른 곳에 복사해서 실행했더니... 이런, msys-1.0.dll이 필요하다고 나온다. 그래서 이것도 복사했더니 이번엔 또
d:\Temp>.\less.exe less_help.txt
WARNING: terminal is not fully functional
less_help.txt  (press RETURN)
저렇게 terminal 이 어쩌고 하는 경고가 나와서, 매번 엔터를 쳐줘야 한다. 이건 뒤져보니까 TERM 환경 변수가 'dumb'으로 되어 있을 때 나타나는 증상이랬는데 (그리고 실제로도 시스템 환경 변수에 어느샌가 TERM이란 변수가 생겨 있고 그 값이 dumb이었다. 범인이 perl인지 msysgit인지 다른 무엇인지 모르겠음), 막상 TERM 변수를 바꿔줘도 여전함. 더 신기한 건 bin 디렉토리에 있는 모든 .dll 파일을 복사해도 여전히 그 증상이 나타나는데, less를 저 bin 디렉토리에 있는 걸 실행하면 괜찮다는 점이다. 무슨 차이인지 모르겠음.

뭐 암튼, 이런 딜레마에 빠졌으니, 대신 less.exe 를 실행하는 배치 파일을 따로 만들어서 그것만 두기로 함

msysgit를 설치할 때, "git와 gitk만 명령 프롬프트창에서 실행가능하도록 함" 옵션에 체크를 했다면 git설치디렉토리/cmd 디렉토리에 git.cmd와 gitk.cmd가 생겨 있다. 이걸 참고해서 less.cmd 를 작성
@rem Do not use "echo off" to not affect any child calls.
@setlocal

@rem Get the abolute path to the parent directory, which is assumed to be the
@rem Git installation root.
@for /F "delims=" %%I in ("%~dp0..") do @set git_install_root=%%~fI
@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%PATH%

@if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@if not exist "%HOME%" @set HOME=%USERPROFILE%

@less.exe %*

그런데 이 파일의 두번째 단락에서 보면 .cmd 파일이 있는 디렉토리의 상위 디렉토리를 git설치 디렉토리로 간주하고 그 아래 bin 폴더를 PATH에 추가하는 형태로 되어 있다. 따라서 cmd 폴더 안에 있을 때는 잘 동작하는데 다른 곳에 옮기면 제대로 안 된다. 그래서 거길 수정해서 강제로 지정하게 했다. 그리고 겸사겸사 -rf 옵션도 주어서, 색상 등 제어문자도 출력시키고 바이너리 파일도 군소리 없이 출력하게 함
@rem Do not use "echo off" to not affect any child calls.
@setlocal

@rem Git installation root.
@set git_install_root=C:\Program Files (x86)\Git
@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%PATH%

@if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@if not exist "%HOME%" @set HOME=%USERPROFILE%

@less.exe -rf %*

이제 less 가 잘 돌아가는 걸 확인하고, PERLDOC_PAGER 환경 변수를 less로 지정하면 됨.

5. 하는 김에 ls도

ls의 경우도, gnuwin32에 있는 건 한글 파일명을 출력할 때 컬럼 조절이 잘 안 되는 듯 하고, --color 옵션을 켜면 깨져서 나오더라. 이것도 msysgit에 있는 걸 쓰자. ls.cmd 를 만들어서 둔다.
@rem Do not use "echo off" to not affect any child calls.
@setlocal

@rem Git installation root.
@set git_install_root=C:\Program Files (x86)\Git
@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%PATH%

@if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@if not exist "%HOME%" @set HOME=%USERPROFILE%

@ls.exe --show-control-chars --color=auto %*

Upload:ls.png
(한글로 된 이름이 깨지지 않고, 종류별로 색상도 구분된다. 이제 좀 낫군!)

6. 결론

윈도7 64비트에서 유닉스용 툴을 쓰고 싶다면...

일단 cygwin을 써 보시고요 (잘 되면 제게도 좀 알려주시고)

잘 안 되면 그때가서 고민합시다.

(뭐, 고생만 한 건 아니라 소득도 있긴 했음. ls 출력의 색상 지원이나, less에서 검색어 하일라이트가 전에는 안 되었었는데, 위처럼 해서 성공하니 꽤나 편하다)

7. Comments

저 집과 회사의 윈7에 모두 cygwin 깔아 씁니다만. 글고 둘 중 적어도 하나는 64비트고요. 아마 둘 다일 것 같은데.
-- 라슈펠 2012-5-24 1:23 am

그니까 저도 그냥 그럴 걸... 구체적인 기억은 안 나는데 뭔가 트라우마가 생겼는지 영 땡기지 않아서ㅋ 근데 bash창 띄워 쓰세요? 명령 프롬프트 창에 PATH만 지정해서 개별 바이너리들 실행해도 잘 돌아가던가요?
-- Raymundo 2012-5-24 8:02 am

전 명령창도 putty를 이용하는지라. ㅡ.ㅡ
-- 라슈펠 2012-5-24 11:55 am

아니 그게 농담이 아니셨군요ㅋㅋ 그럼 좋나요? 마우스로 긁어서 복사할 때 편하겠다 싶긴 한데 그 외에 뭐가 장점일지.
-- Raymundo 2012-5-24 2:50 pm

윈도우 명령창이... 요즘은 어느 정도인지 모르지만 터미널로는 아주 구려요. -_-; 제가 터미널을 테스트하는 몇 프로그램이 있는데, vi/screen/emacs랄까... 명령창에선 vi도 잘 안되고 그랬죠. PuTTY는 오랫동안 터미널을 사용해온 중 최고였지요.
-- 라슈펠 2012-5-24 7:02 pm

그럼 저 툴을 이용하면
벡트레이스 버전 리눅스처럼 윈7 명령창을 쓸수 있다는 건가요?
-- 코구넥스 2013-4-2 12:29 pm

정확히 어느 툴을 어떻게 쓰고 싶다는 건지 모르겠습니다만 정말 리눅스 쉘 쓰듯이 쓰고 싶으면 cygwin 을 써보세요. 그 외의 얘기는 리눅스에서 유용하게 쓰던 less, ls, grep 등의 프로그램을 윈도에서 쓰는 것에 관한 얘기니까요.
-- Raymundo 2013-4-2 12:50 pm
이름:  
Homepage:
내용:
 

기타분류
각주:
1. Twitter:kjoonlee님께서 많은 도움 주셨음. 감사합니다

마지막 편집일: 2013-4-2 12:50 pm (변경사항 [d])
9002 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기