기타 Hacker News · 2일 전

더블 클릭할 땐 잘 되는데 배치 파일로 돌리면 뻗는 프로그램의 비밀

핵심 요약
  • 파일 탐색기에서 더블 클릭하면 정상 작동하는 프로그램이 배치 파일로 실행하면 뻗는 현상에 대해 MS 엔지니어 레이먼드 첸이 원인을 분석했습니다.
  • 탐색기는 실행 파일이 위치한 폴더를 자동으로 '현재 디렉터리'로 잡아주지만, 배치 파일 실행 시에는 작업 디렉터리가 달라 부속 파일을 찾지 못해 오류가 났던 것입니다.
  • 배치 파일에서 pushd/popd 명령어로 프로그램 폴더로 작업 디렉터리를 명시적으로 전환해 실행함으로써 문제를 해결했습니다.
요약 윈도우 개발 분야의 전설적인 엔지니어 레이먼드 첸(Raymond Chen)이 자신의 블로그 'The Old New Thing'을 통해 공유한 흥미로운 트러블슈팅 사례입니다. 어느 날 한 고객이 특정 프로그램을 실행하는 배치 파일(.bat)을 작성하던 중 의아한 현상을 겪고 도움을 요청했습니다. 윈도우 파일 탐색기(Explorer)에서 해당 실행 파일(.exe)을 직접 마우스로 더블 클릭하면 아무 문제 없이 잘 실행되는데, 이상하게 배치 파일 스크립트를 통해 전체 경로를 지정해 실행하면 에러 메시지를 뿜어내며 튕긴다는 것이었습니다. 레이먼드 첸은 이 질문을 듣자마자 프로그램 실행 시 '현재 작업 디렉터리(Current Directory)'가 설정되지 않았을 가능성을 직감했습니다. 윈도우 파일 탐색기에서는 사용자가 .exe 실행 파일(혹은 연결된 문서 파일)을 더블 클릭할 때, 해당 파일이 위치한 폴더를 프로그램의 현재 작업 디렉터리로 자동 지정해 주는 내부 메커니즘이 존재합니다. 이는 프로그램들이 작동에 필요한 부속 설정 파일, 사전, 목차 파일 등을 상대 경로(현재 디렉터리) 기준으로 찾는 경우가 많기 때문에 이를 배려한 설계입니다. 하지만 배치 파일에서 전체 경로(Full Path)만 적어 실행하면, 실행 파일의 위치가 아닌 배치 파일이 실행된 현재 경로가 그대로 작업 디렉터리로 유지됩니다. 결국 실행된 프로그램은 자기 폴더에 있는 필수 부속 파일들을 찾지 못해 오류를 일으킨 것이었습니다. 고객에게 프로그램 실행 전 작업 디렉터리를 변경해 보라고 조언했고, 고객은 `pushd` 명령어로 실행 파일 경로로 이동한 뒤 프로그램을 켜고 `popd`로 원래 경로로 복귀시키는 방식으로 스크립트를 수정해 문제를 완벽히 해결했습니다. 레이먼드 첸은 만약 이 방법으로 안 풀렸다면 레지스트리의 'App Paths' 설정 등을 확인해 봤을 것이라는 팁도 덧붙였습니다.
해외 반응 번역
GUI 앱이 콘솔 창을 할당하려다가 이미 상속받은 콘솔이 있어서 실패하는 특이한 케이스일 줄 알았는데... 그런 경우를 본 적이 있는 것 같지만 구체적인 내용은 기억이 안 나네요.
현대 운영체제에서 '현재 디렉터리'라는 개념 자체가 완전히 사라지는 날이 오길 바랍니다. 보안 문제를 안고 있는 전역 가변 상태(global mutable state)일 뿐입니다. 적어도 UWP는 '가변성'과 '보안' 부분은 고쳤죠. 윈도우 터미널은 왜 굳이 자체 디렉터리를 안 쓰고 예전 작업 디렉터리 전역 상태를 바꾸게 냅뒀는지 모르겠네요.
그건 프로세스 범위(process scope)인데, 이걸 전역이라고 불러야 할지는 논쟁의 여지가 있습니다. 프로세스 내의 여러 스레드 입장에서 보면 작업 디렉터리는 언제든 다른 스레드에 의해 변경될 수 있고, 현재 작업 디렉터리를 가져오는 Win32 API 함수도 이 점을 경고하고 있죠.
Sponsored · 광고