저는 Unix 경로 문자열을 조작하기 위한 라이브러리를 작성 중입니다. 그렇기 때문에 나는 대부분의 사람들이 걱정하지 않는 문법의 모호한 부분을 이해해야 했습니다.
예를 들어, 내가 아는 한, foo/bar
와 foo//bar
둘 다 같은 장소를 가리키는 것 같습니다.
또한 ~
일반적으로 사용자의 홈 디렉터리를 나타내지만,가운데경로? 그러면 어떻게 되나요?
가능한 모든 상황을 올바르게 처리하는 코드를 작성하려면 이러한 질문과 기타 수십 가지 모호한 질문에 답해야 합니다. 설명하는 명확한 참조를 아는 사람이 있습니까?정밀한이것에 대한 문법적 규칙은 무엇입니까?
(불행히도 "Unix 경로 구문"과 같은 용어를 검색하면 해당 변수에 대해 논의하는 페이지가 백만 페이지밖에 나오지 않습니다 $PATH
... 도대체 저는 이 질문에 적합한 태그를 찾는 데 어려움을 겪고 있습니다!)
답변1
경로에는 세 가지 유형이 있습니다.
foo
상대 경로는 ,foo/bar
,../a
, 와 같습니다 . 시스템 호출을 위해 경로를 사용하는 프로세스의 현재 디렉터리에서 시작.
하지 않으며 해당 프로세스의 현재 디렉터리를 기준으로 합니다./
- 절대 경로(예
/
:/foo/bar
또는 )입니다///x
. 1 또는 3 이상으로 시작하고/
상대적이지 않으며 검색은 루트 디렉터리에서 시작됩니다/
. - POSIX는 특별한 처리를 허용
//foo
하지만 방법을 지정하지는 않습니다.일부 시스템에서는 네트워크 파일과 같은 특별한 경우에 이를 사용합니다.. 정확히 2개의 슬래시여야 합니다.
일련의 슬래시는 시작 부분을 제외하고 슬래시와 동일한 효과를 갖습니다.
~
껍질에만 특별함, 이는 쉘에 의해 확장되며 시스템에 전혀 특별하지 않습니다. 확장 방법은 쉘에 따라 다릅니다. 쉘은 와일드카드( *.txt
) 또는 변수 확장 /$foo/$bar
등과 같은 다른 형태의 확장을 수행합니다. 시스템에 관한 한 이는 or ~foo
와 같은 상대 경로일 뿐입니다 ._foo
foo
기억해야 할 사항:
foo/
와 같지 않습니다foo
. 대부분의 시스템에서 대부분의 시스템 호출의 경우 (특히 심볼릭 링크인 경우)foo/.
에 더 가깝습니다 ( though 와 동일 ).foo
foo
foo//
foo/
a/b/../c
반드시 동일할 필요는 없습니다a/c
(예: if 는a/b
심볼릭 링크입니다)...
특별한 대우를 받지 않는 것이 가장 좋습니다 .- 일반적으로 말하면,
a/././././b
같은 것에 대해 생각하는 것이 안전합니다a/b
.
답변2
예를 들어, 내가 아는 한 foo/bar와 foo//bar는 모두 같은 위치를 가리키는 것 같습니다.
예. 이는 소프트웨어가 때때로 첫 번째 부분이 슬래시로 끝나지 않는다고 가정하여 경로를 연결하므로 확인하기 위해 하나가 추가되기 때문에 일반적입니다(두 개 이상이 될 수 있음을 의미). foo///bar
그리고 foo/////bar
와 같은 장소를 가리킨다 foo/bar
. 경로 조작 라이브러리의 좋은 기능은 연속 슬래시 수를 하나로 줄이는 것입니다(URL과 같은 방식으로 사용할 수 있는 경로의 시작 부분을 제외하고 또는 Stephane이 지적했듯이 지정되지 않은 특수 목적을 위해). .
또한 ~는 일반적으로 사용자의 홈 디렉터리를 나타냅니다.
변환은 쉘을 통해 수행됩니다.물결표 확장, 경로의 첫 번째 문자인 경우에만 작동합니다. 이를 처리해야 하는지 여부는 상황에 따라 다릅니다. 예를 들어, 경로가 포함된 명령줄 인수를 받는 일반 프로그램과 함께 라이브러리를 사용하는 경우 물결표 확장은 다음과 같습니다.이미 마쳤어그들이 그 길을 볼 때. 주의를 기울일 가치가 있다고 생각되는 유일한 경우는 텍스트 파일에서 직접 경로를 처리하는 경우입니다.
그렇지 않으면 ~
*nix 경로에서 유효한 문자이므로 다른 것으로 변경하면 안 됩니다. ~처럼이에 따르면, 유닉스 파일 이름에서 허용되지 않는 유일한 문자는 /
(경로 구분 기호이기 때문에) 및 "null"(일명 0바이트)입니다. 일반적으로 텍스트에서는 허용되지 않기 때문입니다.