2010-07-17 2 views
4

getcwd()을 사용하여 현재 작업 디렉토리를 얻는 빌드 시스템 도구가 있습니다. 그럴 때가 있습니다 만, 때로는 사람들이 경로에 공백이있어 빌드 시스템에서 지원하지 않는 경우가 있습니다.getcwd()와 getenv ("PWD")가 일치하지 않으면 어떻게해야합니까?

ln -s "Directory With Spaces" DirectoryWithoutSpaces 

다음으로 기호 링크를 만들 수 있다고 생각할 것입니다. 그러나 불행히도 나를 위해 getcwd()은 모든 심볼릭 링크를 해결합니다. 나는 getenv("PWD")을 사용하려고 시도했지만, 동일한 경로를 가리키고 있지 않습니다. getcwd()에서 돌아옵니다. 내가 환경 변수를 업데이 트하지 않는 것에 대한 make -C 비난, 나는 생각한다.

/Users/carl/Directory With Spaces/Some/Other/Directories 

그리고 getenv("PWD")이 날 제공 : 지금, getcwd() 다시 같은 경로를 나에게 제공

/Users/carl/DirectoryWithoutSpaces 

그래서 - 기호 링크가 해결되지 않는 getcwd() 같은 어떤 기능이?

편집 :

나는

cd Some/Other/Directories ; make 

make -C Some/Other/Directories 

을 변경하고 다른 해결책이 없다면 다음 getenv("PWD") 작품 .. 나는 그것을 사용할 수 있습니다.

+0

경로의 공백으로 인해 프로그램의 어떤 부분이 작동하지 않습니까? – eruciform

+1

'mv ~/"공간이있는 디렉토리"~/DirectoryWithoutSpaces'? : P – muhmuhten

+1

@eruciform, 문제의 도구는 많은 수의 메이크 파일을 생성합니다. 이 경로 이름에 공백이 있으면 여러 가지 이유가 있습니다. 필자는 편집에서 언급 한 변경 사항을 적용했으며, 현재 공간 문제를 전체적으로 수정하고 있습니다. 그러나 상관없이 symlink와 해결 된 경로 이름을 사용하여 makefile을 생성하는 것은 다소 이상합니다. 위에 수정 한 내용은 수정되었지만 여전히 대체 솔루션에 관심이 있습니다. –

답변

6

스티븐스에 의해 UNIX 환경 성경의 고급 프로그래밍에 따르면, 112 페이지는 : 커널이 현재 작업 디렉토리의 지식을 유지해야하기 때문에

, 우리는 현재 값을 가져올 수 있어야합니다. 불행하게도, 각 프로세스에 대해 커널이 유지 보수하는 모든 노드는 현재 작업 디렉토리의 i- 노드 번호와 장치 ID입니다. 커널은 디렉토리의 전체 경로 이름을 유지하지 않습니다.

죄송합니다. 다른 방법으로 해결해야 할 필요가있는 것 같습니다.

+1

매우 슬픈 일입니다. 하지만 지금은 작동하는 시스템이 있습니다. –

+0

예, 죄송합니다. 대답이 도움이되기를 바랍니다. – eruciform

+0

만큼 대답하는 것 같습니다. 내 편집의 해결 방법은 저에게 좋습니다. 감사! –

3

getcwd()은 기호 링크를 통해 수행 한 경로를 확인할 방법이 없습니다. getcwd()의 기본 구현은 현재 디렉토리 '.'을 통계 한 다음 상위 디렉토리 '..'을 열고 '.'과 동일한 디렉토리 번호가있는 디렉토리 이름을 찾을 때까지 항목을 검색합니다. 그런 다음 루트 디렉토리를 찾을 때까지 프로세스를 위로 반복합니다.이 때 루트 디렉토리가 전체 경로를 갖습니다. 어느 시점에서도 상징적 인 링크를 통과하지 않습니다. 따라서 getcwd()이 심볼 링크를 통해 추적되는 경로를 계산하는 것은 시스템 호출이나 라이브러리 함수로 구현되는지에 관계없이 불가능합니다.

최상의 해결 방법은 빌드 시스템이 공백이 포함 된 경로 이름을 처리하도록하는 것입니다. 이는 셸을 통해 전달 된 경로 이름을 인용하는 것을 의미합니다. C 프로그램은 이름의 공백을 신경 쓰지 않습니다. 쉘과 같은 프로그램이 문제가되는 문자열을 해석 할 때만 해당합니다. (사전 처리기를 실행하는 셸 스크립트로 구현 된 컴파일러는 공백이 포함 된 경로 이름에 문제가있는 경우가 많습니다.)

+0

예 - 명확하게'getcwd()'는 작동하지 않습니다. 나는 그 대안을 찾을 수 있기를 바랬다. 빌드 시스템이 공간을 처리하게 만드는 것은 완전히 악몽입니다. ​​GNU make는 그것을 다루는 데 악명이 높습니다. 절대 경로 지정 요구 사항을 해결하는 것이 더 쉬울 것이라고 생각하지만 여전히 소풍이 아닙니다. –