파일 위치를 scp 하위 프로세스로 전달하는 파이썬 스크립트를 작성 중입니다. 괜찮습니다. 그러나 경로에 이중 ‘이있는 파일 이름으로 경로를 연결할 수있는 상황에 처해 있습니다 /
. bash는 파일 구분 기호가 여러 개인 경우 신경 쓰지 않는다는 것을 알고 있지만 정확히 어떻게 수정되는지 궁금합니다. 여분 /
의 s 를 제거하는 bash입니까, 아니면 실제로 중요하지 않습니까?
/
연결하는 동안 추가 코드를 확인하기 위해 몇 줄의 코드를 저장하기 때문에 묻습니다 . 큰 문제가 아니라는 것도 알고 있지만 궁금합니다. 나는 선이있는 bash는 스크립트가 cd //usr
(대신 cd /usr
여러 사용에 의미가있을 수 있습니다 의미하는 것), /
경로에들
답변
여러 개의 슬래시가 허용되며 단일 슬래시와 같습니다. 로부터 단일 유닉스 규격 (버전 3) , 기본 정의 §3.266 경로 : “. 여러 개의 연속 슬래시 한 슬래시와 같은 것으로 간주됩니다”
한 가지 예외가 있습니다. 경로 이름이 정확히 두 개의 슬래시로 시작하면 다르게 취급 될 수 있습니다 (참조 : 기본 정의 §4.11 경로 이름 확인 ). Linux 자체는이 작업을 수행하지 않지만 일부 응용 프로그램과 다른 유닉스 시스템 (예 : Cygwin)도 마찬가지입니다.
/
경로명의 끝에 후행 은 경로명이 디렉토리를 참조하도록합니다. ( POSIX 1003.1-2001 (Single Unix v3) 기본 정의 §4.11 경로 이름 확인 에서, 후행 /
은 후행 과 동일합니다 /.
. POSIX 1003.1-2008 (Single Unix v4) 기본 정의 §4.12 는 /.
순서대로 해당 요구 사항을 제거합니다. 존재하지 않는 디렉토리에 대처하기 위해 (예 : mkdir foo/
작동해야하지만 mkdir foo/.
그렇지 않은 경우- 변경에 대한 이론적 근거 참조 )
디렉토리 항목에 작동하는 프로그램의 경우 디렉토리 foo
에 대한 기호 링크 인 경우 전달 foo/
은 프로그램이 기호 링크 대신 디렉토리에 작동하도록하는 방법입니다.
¹ 이는 파일 이름에 액세스하는 경우에만 경로 이름 확인에만 적용됩니다. 파일 이름 조작이 다르게 작동 할 수 있습니다. 예를 들어 basename
및 dirname
슬래시를 후행 무시합니다.
답변
OS는 직접 syscall을 사용하여 C 프로그램을 시도하여 경로에 //로 열면 관심이없는 것처럼 보입니다.
파이썬 라이브러리 함수 os.path.normpath를 사용하여 정규화 할 수 있으므로 여분의 문자열을 스캔해야합니다. 다른 언어들도 비슷한 기능을 가지고 있습니다.
http://docs.python.org/library/os.path.html#os.path.normpath
답변
내가 본 모든 유닉스 시스템에서 단일 것과 동일 /
하지만 유닉스 표준 은
두 개의 연속 슬래시로 시작하는 경로 이름은 구현 정의 방식으로 해석 될 수 있지만 두 개 이상의 선행 슬래시는 단일 슬래시로 취급됩니다.
시스템에 따라 특별하게 처리 될 수 있습니다. (일부 구형 Unix 버전 /
은 원격 파일 시스템 액세스를 위해 이중 선행 을 사용했으며 여전히 일부 파일이있을 수 있습니다.)
답변
os.path.join
파이썬에서 사용 하면 여러 개의 슬래시가 없습니다. 문자열을 연결하여 파일 이름을 직접 만드는 것은 열악한 Python 스타일로 간주됩니다.
답변
다른 점이 없다.
여러 슬래시가 무시됩니다 (효과 없음). 예 :
ls -al //usr///////bin/sed
답변
물론 경로를 통과하여 가능한 여러 / (슬래시)가있는 경로를 표준화 할 수 있습니다 tr -s
NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)
… 그리고 사용 $NORMALIZED
그러나 필요합니다. 내가 아는 것처럼 UNIX 커널은 동시 경로 구분 기호를 무시하거나 개념적으로 처리해야합니다 … /./
…