유닉스 경로 문자열 조작을위한 라이브러리를 작성 중입니다. 이 경우 대부분의 사람들이 걱정하지 않는 구문의 모호한 부분을 이해해야합니다.
예를 들어, 내가 말할 수있는 최선으로, 그 것 foo/bar
과 foo//bar
같은 장소에 두 점을.
또한 ~
일반적으로 사용자의 홈 디렉토리를 나타내지 만 경로 중간 에 나타나면 어떻게합니까? 그러면 어떻게됩니까?
가능한 모든 경우를 올바르게 처리하는 코드를 작성하려면이 수십 개의 다른 모호한 질문에 대답해야합니다. 이 물건에 대한 정확한 구문 규칙을 설명하는 명확한 참조를 아는 사람 이 있습니까?
(안타깝게도, “유닉스 경로 구문”과 같은 용어를 검색하면 $PATH
변수를 논의하는 백만 페이지가 나타납니다 .
답변
세 가지 유형의 경로가 있습니다.
- 상대 경로가 좋아
foo
,foo/bar
,../a
,.
. 그것들은 시작하지 않으며/
해당 경로로 시스템 호출을하는 프로세스의 현재 디렉토리와 관련이 있습니다. - 절대 경로 좋아
/
,/foo/bar
또는///x
. 그들은 1 또는 3 이상으로 시작하며,/
상대적이지 않으며/
루트 디렉토리 에서 시작합니다 . - POSIX는
//foo
특별하게 취급 할 수 있지만 방법을 지정하지는 않습니다. 일부 시스템은 네트워크 파일과 같은 특수한 경우에이를 사용합니다 . 정확히 2 개의 슬래시 여야합니다.
처음부터, 슬래시 시퀀스는 하나처럼 작동합니다.
~
쉘에만 특별하고 쉘 에 의해 확장되며 시스템에는 전혀 특별하지 않습니다. 확장 방법은 쉘에 따라 다릅니다. 쉘은 globbing ( *.txt
) 또는 가변 확장 /$foo/$bar
또는 기타 확장과 같은 다른 확장 형식을 수행 합니다. 시스템에 관한 한 또는 ~foo
같은 상대 경로 입니다._foo
foo
명심해야 할 사항 :
foo/
와 동일하지 않습니다foo
. 대부분의 시스템에서 대부분의 시스템 호출에 대해 (특히 심볼릭 링크 인 경우 )foo/.
보다 가깝 습니다foo
( 그렇지만 동일합니다 ).foo
foo//
foo/
a/b/../c
a/c
(예a/b
: 심볼릭 링크 인 경우 ) 와 반드시 같을 필요는 없습니다 . 최선은..
특별하게 대우하지 않습니다 .- 일반적으로
a/././././b
동일 하게 고려 하는 것이 안전합니다a/b
.
답변
예를 들어, 내가 알 수있는 한 foo / bar와 foo // bar는 모두 같은 장소를 가리키는 것으로 보입니다.
예. 소프트웨어가 첫 번째 부분이 슬래시로 끝나지 않았다고 가정 할 때 경로를 연결하기 때문에 일반적으로 발생하므로 확인을 위해 하나를 던집니다 (두 개 이상이 될 수 있음). foo///bar
그리고 foo/////bar
또한 같은 장소를 가리 킵니다 foo/bar
. 경로 조작 라이브러리의 좋은 기능은 경로 시작 부분을 제외하고 URL 슬래시 방식으로 사용하거나 Stephane이 지적한 것처럼 Stephane가 지적한대로 지정되지 않은 특수 목적).
또한 ~는 일반적으로 사용자의 홈 디렉토리를 나타냅니다.
이 변환은 셸 및 물결표 확장을 통해 수행되며 경로의 첫 번째 문자 인 경우에만 작동합니다. 이를 처리해야하는지 여부는 상황에 따라 다릅니다. 라이브러리가 경로를 포함하는 명령 행 인수를 수신하는 일반 프로그램과 함께 사용되는 경우 경로 를 볼 때 물결표 확장이 이미 수행 됩니다. 내가 걱정할 수있는 유일한 상황은 텍스트 파일에서 직접 경로를 처리하는 경우입니다.
그 외에도 ~
* nix 경로의 합법적 인 특성이므로 다른 것으로 변경해서는 안됩니다. 이것에 따르면 , 유닉스 파일 이름에서 유효하지 않은 유일한 문자는 /
(경로 구분 문자 이기 때문에) 및 “null”(일명 0 바이트)은 일반적으로 텍스트에서 불법이기 때문입니다.