it-swarm-ko.tech

Linux는 여러 개의 연속 경로 구분 기호 (/ home ///// username /// file)를 어떻게 처리합니까?

파일 위치를 scp 하위 프로세스로 전달하는 python 스크립트를 작성 중입니다. 모두 괜찮습니다. 그러나 파일 이름으로 경로를 연결하는 상황에 처해 있습니다. 경로에 이중 '/가 있습니다. 파일 분리기가 여러 개인 경우 bash가 신경 쓰지 않는다는 것을 알고 있지만 정확히 어떻게 수정되는지 궁금합니다. 추가 / 또는 정말 중요하지 않습니까?

연결하는 동안 추가 /를 확인하기 위해 몇 줄의 코드를 저장하기 때문에 묻습니다. 큰 문제는 아니라는 것도 알고 있지만 궁금합니다. cd //usr 대신 cd /usr 줄을 가진 bash 스크립트가 있는데, 경로에서 여러 /를 사용하는 것이 중요 할 수 있습니다.

117
Falmarri

여러 개의 슬래시가 허용되며 단일 슬래시와 같습니다. Single Unix 사양 (버전 4) , 기본 정의 §3.271 pathname :“여러 연속 슬래시는 하나의 슬래시와 동일한 것으로 간주됩니다.”

한 가지 예외가 있습니다. 경로명이 두 개의 연속 문자로 시작하는 경우 선행 문자 다음에 오는 첫 번째 구성 요소는 구현 정의 방식으로 해석 될 수 있습니다. (참조 : 기본 정의 §4.13 경로 이름 확인 ). Linux 자체는이를 수행하지 않지만 일부 응용 프로그램과 다른 유닉스 시스템은 가능합니다 (예 : Cygwin).

경로명의 끝에 /가 있으면 경로명이 디렉토리를 참조하게합니다. ( POSIX 1003.1-2001 (Single Unix v4) 기본 정의 §4.11 경로 이름 확인) 에서 후행 /는 후행 /.와 같습니다. POSIX 1003.1-2008 (Single Unix v4) 기본 정의 §4.1 존재하지 않는 디렉토리에 대처하기 위해 /.와 동등한 조건을 제거합니다 (예 : mkdir foo/ 작동하지만 mkdir foo/.는 그렇지 않습니다 — 변경에 대해서는 rationale 참조).

디렉토리 항목에서 작동하는 프로그램의 경우, foo가 디렉토리에 대한 기호 링크 인 경우 foo/를 전달하면 프로그램이 기호 링크 대신 디렉토리에서 작동하게됩니다.

¹ 이는 경로 이름 확인, 즉 파일에 액세스 할 때만 적용됩니다. 파일 이름 조작이 다르게 작동 할 수 있습니다. 예를 들어 basenamedirname 슬래시를 무시합니다.

OS는 경로에 //로 열려있는 직접 syscall을 사용하여 C 프로그램을 시도한 것처럼 신경 쓰지 않는 것처럼 보입니다.

python 라이브러리 함수 os.path.normpath를 사용하여 정규화 할 수 있으므로, 문자열을 스캔하여 추가 정보를 찾을 필요가 없습니다. 다른 언어도 비슷한 기능을 가지고 있습니다.

http://docs.python.org/library/os.path.html#os.path.normpath

17
Ivatar

내가 본 모든 유닉스 시스템에서 단일 /이지만 nix standard

두 개의 연속 슬래시로 시작하는 경로 이름은 구현 정의 방식으로 해석 될 수 있지만 두 개 이상의 선행 슬래시는 단일 슬래시로 취급됩니다.

시스템에 따라 특별하게 처리 될 수 있습니다. (일부 구형 유닉스 버전은 이중 선행 / 원격 파일 시스템 액세스의 경우 여전히 일부가있을 수 있습니다.)

9
Fred Foo

사용하다 os.path.join in Python 그리고 여러 개의 슬래시를 얻지 못할 것입니다. 문자열을 연결하여 파일 이름을 직접 만드는 것은 좋지 않은 것으로 간주됩니다 Python 스타일).

7
Neil Mayhew

다른 점이 없다.

여러 개의 슬래시가 무시됩니다 (효과 없음). 예 :

ls -al //usr///////bin/sed
3
ChristopheD

물론 여러 개의/(슬래시)가있는 경로를 tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

... 그리고 $NORMALIZED

그러나 필요합니다. 내가 아는 것처럼 유닉스 커널은 동시 경로 구분자를 무시하거나 개념적으로 ..././...

0
Jim Dennis