경로 구문 규칙 모호한 부분을

유닉스 경로 문자열 조작을위한 라이브러리를 작성 중입니다. 이 경우 대부분의 사람들이 걱정하지 않는 구문의 모호한 부분을 이해해야합니다.

예를 들어, 내가 말할 수있는 최선으로, 그 것 foo/barfoo//bar같은 장소에 두 점을.

또한 ~일반적으로 사용자의 홈 디렉토리를 나타내지 만 경로 중간 에 나타나면 어떻게합니까? 그러면 어떻게됩니까?

가능한 모든 경우를 올바르게 처리하는 코드를 작성하려면이 수십 개의 다른 모호한 질문에 대답해야합니다. 이 물건에 대한 정확한 구문 규칙을 설명하는 명확한 참조를 아는 사람 이 있습니까?

(안타깝게도, “유닉스 경로 구문”과 같은 용어를 검색하면 $PATH변수를 논의하는 백만 페이지가 나타납니다 .



답변

세 가지 유형의 경로가 있습니다.

  • 상대 경로가 좋아 foo, foo/bar, ../a, .. 그것들은 시작하지 않으며 /해당 경로로 시스템 호출을하는 프로세스의 현재 디렉토리와 관련이 있습니다.
  • 절대 경로 좋아 /, /foo/bar또는 ///x. 그들은 1 또는 3 이상으로 시작하며, /상대적이지 않으며 /루트 디렉토리 에서 시작합니다 .
  • POSIX는 //foo특별하게 취급 할 수 있지만 방법을 지정하지는 않습니다. 일부 시스템은 네트워크 파일과 같은 특수한 경우에이를 사용합니다 . 정확히 2 개의 슬래시 여야합니다.

처음부터, 슬래시 시퀀스는 하나처럼 작동합니다.

~쉘에만 특별하고 쉘 에 의해 확장되며 시스템에는 전혀 특별하지 않습니다. 확장 방법은 쉘에 따라 다릅니다. 쉘은 globbing ( *.txt) 또는 가변 확장 /$foo/$bar또는 기타 확장과 같은 다른 확장 형식을 수행 합니다. 시스템에 관한 한 또는 ~foo같은 상대 경로 입니다._foofoo

명심해야 할 사항 :

  • foo/와 동일하지 않습니다 foo. 대부분의 시스템에서 대부분의 시스템 호출에 대해 (특히 심볼릭 링크 인 경우 ) foo/.보다 가깝 습니다 foo( 그렇지만 동일합니다 ).foofoo//foo/
  • a/b/../ca/c(예 a/b: 심볼릭 링크 인 경우 ) 와 반드시 같을 필요는 없습니다 . 최선은 ..특별하게 대우하지 않습니다 .
  • 일반적으로 a/././././b동일 하게 고려 하는 것이 안전합니다 a/b.

답변

예를 들어, 내가 알 수있는 한 foo / bar와 foo // bar는 모두 같은 장소를 가리키는 것으로 보입니다.

예. 소프트웨어가 첫 번째 부분이 슬래시로 끝나지 않았다고 가정 할 때 경로를 연결하기 때문에 일반적으로 발생하므로 확인을 위해 하나를 던집니다 (두 개 이상이 될 수 있음). foo///bar그리고 foo/////bar또한 같은 장소를 가리 킵니다 foo/bar. 경로 조작 라이브러리의 좋은 기능은 경로 시작 부분을 제외하고 URL 슬래시 방식으로 사용하거나 Stephane이 지적한 것처럼 Stephane가 지적한대로 지정되지 않은 특수 목적).

또한 ~는 일반적으로 사용자의 홈 디렉토리를 나타냅니다.

이 변환은 셸 및 물결표 확장을 통해 수행되며 경로의 첫 번째 문자 인 경우에만 작동합니다. 이를 처리해야하는지 여부는 상황에 따라 다릅니다. 라이브러리가 경로를 포함하는 명령 행 인수를 수신하는 일반 프로그램과 함께 사용되는 경우 경로 를 볼 때 물결표 확장이 이미 수행 됩니다. 내가 걱정할 수있는 유일한 상황은 텍스트 파일에서 직접 경로를 처리하는 경우입니다.

그 외에도 ~* nix 경로의 합법적 인 특성이므로 다른 것으로 변경해서는 안됩니다. 이것에 따르면 , 유닉스 파일 이름에서 유효하지 않은 유일한 문자는 /(경로 구분 문자 이기 때문에) 및 “null”(일명 0 바이트)은 일반적으로 텍스트에서 불법이기 때문입니다.