저는 하스켈을 배우기 시작했고, 이를 위해 윈도우용 하스켈 플랫폼을 설치했습니다. 현재 WinGHCi
를 사용하고 있습니다. 디렉토리를 변경하는 데 사용되는 :cd
명령이 있다는 것을 알게되었습니다. 하지만 문제는 내가 현재 어느 디렉토리에 있는지 어떻게 알 수 있느냐는 것입니다. 그것을 먼저 알지 못하면 왜 디렉토리를 변경하고 싶을까요? 많은 검색을 했지만 답을 찾을 수 없었습니다.
현재 작업 디렉터리를 알 수 있는 방법이 있는지 알려주세요. 가급적이면 리눅스의 콘솔처럼 명령 프롬프트 자체에 현재 디렉터리가 표시되도록 구성하고 싶습니다.
Daniel의 제안에 따라 다음을 수행했습니다:
파일이 없으므로 (유닉스 계열 OS 용이라고 생각합니다) [여기에 설명 된대로][4]
C:\Users\Apelles\AppData\Roaming\ghc폴더에 파일
ghci.conf`를 만들었습니다.ghci.conf
에 복사하여 붙여넣습니다.ghci.exe
를 시작했습니다. 이전에 로드하던 모듈보다 몇 개 더 많은 모듈이 로드되는 것을 확인했습니다. 다음은 스냅샷입니다:보시다시피 더 많은 모듈을 로드하고 마지막 줄에 다음과 같이 표시됩니다,
프롬프트 문자열을 구문 분석할 수 없습니다. 하스켈 구문을 사용하세요.
무슨 뜻일까요? 다음 스크립트에서 어떤 줄이 문제를 일으키고 있나요?
let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt
또한 ghci.conf
파일의 이름을 임의의 이름으로 변경한 다음 ghci.exe
를 시작하면 이러한 모듈이 로드됩니다:
앞서 말했듯이 모듈의 수가 적기 때문에 ghci.conf
를 사용하면 ghci.exe
가 성공적으로 작동하지만 어느 시점에서 실패합니다. 이 문제를 어떻게 해결하나요?
ghci 프롬프트를 현재 작업 디렉터리로 설정하는 가난한 사람의 해결책은 다음을 넣는 것입니다.
let cur fill = do { cwd <- System.Directory.getCurrentDirectory; return (":set prompt \"" ++ cwd ++ fill ++ " \""); }
:def doprompt (\_ -> cur ">")
:def mycd (\dir -> System.Directory.setCurrentDirectory dir >> cur ">")
:doprompt
를 넣는 것입니다.
첫 줄에 현재 디렉터리를 가져오는 cur :: String -> IO 문자열
을 정의하여 현재 디렉터리를 가져오고 그에 따라 프롬프트를 설정하는 ghci 명령을 반환합니다. 그런 다음 해당 작업을 수행하는 ghci 명령 doprompt
와 디렉터리를 변경하고 프롬프트를 설정하는 명령을 정의합니다. 마지막 줄은 시작 시 :doprompt
를 실행합니다.
안타깝게도 :cd dir
은 디렉터리 변경을 반영하지 않으므로 나중에 수동으로 :doprompt
를 수행하거나 :mycd
를 사용하여 디렉터리를 변경해야 합니다.
너무 긴 프롬프트를 피하려면 파일 경로의 초기 부분을 삭제하여 getCurrentDirectory
의 결과를 조작할 수 있습니다.
이 간단한 접근 방식의 또 다른 단점은 프롬프트에 로드된 모듈에 대한 정보가 더 이상 포함되지 않는다는 것입니다. 이 모든 것이 극복될 수 있다고 생각하지만, 지금 당장 파헤칠 만큼 동기가 부여되지 않았습니다.
명령 프롬프트 유형 '에 크시.! cd '얻게된다면 너회가 출력물에는 부여하느뇨 현재 디렉터리입니다. 일반적으로 '를 사용합니다. 셸 명령을 실행할 수 있는 모든 셸 명령을 명령 프롬프트 크시 '등이 뒤를 이었다. 이 때문에 윈도, 맥 / 리눅스 셸 서로 다를 수 있는 명령을 사용할 수 있습니다.