2011-08-19 3 views
7

바이너리의 전체 경로 이름을 찾기 위해 $ PATH를 걸어야하는 C 응용 프로그램에서 일하고 있습니다. 유일한 허용 종속성은 glibc입니다 (즉, 외부 프로그램을 호출하지 않습니다). 일반적인 경우에, getenv ("PATH")를 콜론으로 쪼개서 각 디렉토리를 하나씩 검사하는 것을 수반하지만, 나는 모든 가능한 경우를 다루고 싶다. 내가 뭘 봐야 할까? 특히, ~로 시작하는 경로는 $ HOME으로 확장되거나, 다음을 포함하는 경로가 허용되는 상대 경로입니까? char allowed?

답변

11

한 번 깜빡 한 점은 빈 문자열 PATH은 현재 디렉토리를 의미한다는 것입니다. 두 개의 인접한 콜론 또는 콜론이 끝에 있거나 시작 부분이 PATH 인 경우 현재 디렉토리가 포함됩니다. 예를 들어 man bash에 설명되어 있습니다.

또한 POSIX specification에 있습니다.

그래서

PATH=:/bin 
PATH=/bin: 
PATH=/bin::/usr/bin 

모든 나는 이것이 일반적으로 리눅스에 문제가 확실하지 않다, 그러나 당신의 코드가 작동하는지 확인

+3

+1 소스 코드에서 'which'를 확인한 후 이것이 유일한 코너 케이스 인 것으로 보입니다. ''처음에는 전체 경로가 주어지고 파일이 실행 가능한지 확인합니다. 그런 다음 경로의 각 구성 요소를 앞에 추가하고 다시 검사하여 빈 경로 구성 요소를 현재 디렉토리로 바꿉니다. –

+0

사양에 따라,'which'의 구현과 몇 가지 일반적인 표준 쉘은 꽤 좋은 관점을 제공해야합니다. – Novelocrat

2

PATHPATH 일부 펑키이있는 경우 현재 디렉토리 의미 (예 : UTF-8) 인코딩을 사용하여 멋진 문자로 디렉토리를 처리 할 수 ​​있습니다. 나는 이것이 파일 시스템 인코딩에 달려 있다고 생각한다.

사용자 이름에 멋진 글자가있는 러시아인의 버그 보고서 작업을 기억합니다. (따라서 홈 디렉토리 이름은 PATH입니다.)

+0

아니요, 인코딩은'PATH'와는 관련이 없습니다. 프로그램이 그것을 고려한다면 그것은 버그입니다. –

+0

@R .: 흥미 롭습니다. 그 주장을 뒷받침 할 몇 가지 사양이 있습니까? 필자가 알기로'PATH'를 파싱하려면 문자열을'bytes' 시퀀스가 ​​아닌 일련의 문자로 취급해야하므로 인코딩을 알아야합니다. –

+1

'PATH'에서 특별한 문자는':'뿐입니다. 따라서 여러분의 주장이 유효 할 수있는 유일한 시간은 레거시 Windows 지향 CJK 인코딩입니다. 그러나 유닉스에서는 일반적으로 사용할 수없는 것으로 간주됩니다. –

1

미성년자이지만 이미 언급되지 않았으므로 추가하겠습니다. $ PATH는 절대 경로와 상대 경로를 모두 포함 할 수 있습니다. 각 디렉토리에 chdir (2)로 경로 목록을 크롤링하는 경우 크롤링을 반복 할 때마다 원래 작업 디렉토리 (getcwd (3))와 chdir (2)를 추적해야합니다.

1

기존의 답변은 대부분 다루지 만 아직 대답하지 않은 질문의 일부를 포함하는 가치 :

  1. $와 ~ $의 PATH의 값 특별하지 않다.
  2. $ PATH가 설정되지 않은 경우 execvp()은 기본값을 사용합니다.
관련 문제