경로 구문 규칙


10

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

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

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

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

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


ok ~ tilde 및 -filename 확장은 모든 Unix 환경의 기본 POSIX 정의 기능입니다. 몇 가지 팁 : 파일 이름은 \ 0 또는 / 이외의 것일 수 있습니다 . //////와 /는 같은 것입니다. $ PWD는 커널 에서 처리되며 / proc의 모든 (Linux) 프로세스에 대해 읽을 수 있습니다 . /./는 경로의 루트 에서만 발생할 수 있습니다. $ PATH에서 :::::와 :는 같은 것입니다. / dev / null / dev / tty 및 / tmp는 모든 호환 시스템에 대해 POSIX 보장 경로입니다.
mikeserv

1
리눅스~ 에서 여러 경로 구분 기호를 처리하는 방법 (/ home //// username /// file) 에서 대부분의 질문에 대한 부분 은 다루지 않습니다 . 규범 적 참조에 가장 가까운 것은 POSIX 또는 Single Unix 사양 일 것 입니다. 쉽게 읽을 수는 없습니다.
Gilles 'SO- 악한 중지'

답변:


13

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

  • 상대 경로가 좋아 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.

요약하자면, 쉘 경로 조작에 대해 신경 쓰지 않으면 (광범위하고 복잡합니다) /, .그리고 ..(?) 만 신경
MathematicalOrchid

//foo처리 예는 Cygwin에서 UNC 경로에 사용됩니다 . 즉, //server/share/dir/file.txt기본적으로 시스템 외부를 가리키는 올바른 경로입니다. Cygwin은 로컬 시스템을 찾을 수 없으면 로컬 시스템을 다시 살펴 봅니다 server.
워렌 영

3

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

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

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

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

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


물결표 확장에 대한 설명은 +1; 나는 당신이 그것을 가진 다른 사용자를 참조 할 수 있다는 것을 몰랐 습니다!
MathematicalOrchid

2
Stephane이 말했듯이 모든 반복 슬래시를 맹목적으로 무너 뜨릴 수는 없습니다. 경로 시작시 여러 개의 슬래시를주의해서 다루어야합니다.
워렌 영

@WarrenYoung 이것을 명확히하기 위해 편집했습니다. 추신. 앞으로??! O_O
goldilocks

더 나은 것은 아니지만 이것이 URL과 관련이 있다고는 말할 수 없습니다. UNC는 1980 년대 후반으로 거슬러 올라가지 만 URL은 몇 년 후까지 나타나지 않았습니다.
워렌 영

이 UNC 년대는 것으로 보인다 있지만 @WarrenYoung 페어 충분, MS 플랫폼에 고유 하므로 //기술적으로 그 중 하나가 아닙니다. URL에 대한 그리고 SC에 따라 자유로이 모호한 POSIX 사양 은 이러한 URL에서 유래 한 // 것일 수 있습니다.이 경우 "URL-ish"는 협약에 적합한 레이블로 보입니다 (UNC가 더 오래된 경우에도 유사합니다. 의도하지 않은). 난 단지 것을, "그들이 URL이있다"고 말하지 않을 것이다 //\\ 에 "URL 틱"목적을 제공합니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.