coreutils 매뉴얼에서:
일부 GNU 프로그램(적어도 cp 및 mv)에서는 각 소스 인수를 조작하기 전에 뒤에 오는 슬래시를 제거할 수 있습니다. --strip-trailing-slashes 옵션을 사용하면 이 동작이 가능해집니다.
이는 소스 매개변수 뒤에 슬래시가 있고 디렉토리에 대한 기호 링크를 지정할 때 유용합니다. 이런 상황은 사실 매우 흔한 일이기 때문에일부 쉘은 이러한 기호 링크에서 파일 이름 완성을 수행할 때 자동으로 후행 슬래시를 추가할 수 있습니다.이 옵션이 없으면 예를 들어 mv(시스템의 이름 바꾸기 기능을 통해)는 후행 슬래시를 기호 링크 역참조 요청으로 해석해야 하므로 기호 링크 대신 간접적으로 참조되는 디렉터리의 이름을 바꿔야 합니다. 이 동작이 기본값이 된 것이 놀랍게 보일 수도 있지만,이는 POSIX에서 필요합니다.표준의 다른 부분과도 일치합니다.
굵은 글씨는 쉘의 파일 이름 확장이 심볼릭 링크 뒤에 슬래시를 추가한다는 것을 의미합니까?
Bash 매뉴얼이나 POSIX 사양의 어디에서 볼 수 있나요?
처음에는 명령(셸이 아님)이 명령줄 인수로 후행 슬래시가 있거나 없는 심볼릭 링크를 해석하는 방법에 따라 다르다고 생각했습니다.
답변1
POSIX 필수 동작은 mv
후행 슬래시를 기호 링크 역참조 요청으로 해석하는 것입니다. 즉, foo
기호 링크의 경우 POSIX mv
는 (다른 명령과 마찬가지로) 해석해야 한다고 지시합니다.
mv foo/ bar/
foo
자신 대신 가리키는 디렉터리를 이동하라는 요청입니다 foo
. 이것은 대략경로명 확인:
하나 이상의 슬래시가 아닌 문자를 포함하고 하나 이상의 후행 슬래시로 끝나는 경로 이름은 마치
.
점 문자( )가 경로 이름에 추가된 것처럼 구문 분석됩니다.
즉 foo/
, foo/.
.
POSIX는 기호 링크 뒤에 슬래시를 추가하는 경로 이름 확장을 강제하거나 허용하지 않습니다. 이는 기본이 아닌 옵션을 설정할 때 일부 쉘이 수행하는 작업입니다. Bash에 이 옵션이 있는지는 모르겠습니다. Zsh 에도 set -o markdirs
이 옵션이 있지만 디렉터리에 대한 심볼릭 링크가 아닌 디렉터리에만 영향을 미칩니다.
다른 경우에는 후행 슬래시가 자연스럽게 매개변수 끝에 나타납니다. 슬래시로 끝나는 glob의 경우 glob은 디렉터리 및 디렉터리에 대한 기호 링크만 일치하며 파일 이름 확장은 후행 슬래시를 유지합니다. 따라서 mv a*/ /somewhere
이름이 로 시작하는 현재 디렉터리의 모든 하위 디렉터리 a
와 현재 디렉터리에 있는 모든 심볼릭 링크 대상이 이동되어 심볼릭 링크가 디렉터리로 시작 a
하고 디렉터리를 대상으로 합니다. 또 다른 경우는 완료되었습니다. bash와 zsh에는 완료 옵션이 많기 때문에 자세히 설명하지 않겠습니다. 그러나 옵션에 따라 foo/
완료로 끝나고 디렉토리에 대한 심볼릭 링크가 되기 foo
쉽습니다 .foo
답변2
굵은 글씨는 쉘의 파일 이름 확장이 심볼릭 링크 뒤에 슬래시를 추가한다는 것을 의미합니까?
아니 그 뜻은ㅏ껍데기가능한링크가 디렉토리를 가리키고 '--strip-trailing-slashes' 옵션을 제공하면 사용자가 해당 작업의 부작용을 부분적으로 방지할 수 있다면 이는 합리적으로 보입니다. 이것이 인용한 텍스트의 문자 그대로의 의미입니다.
Bash 매뉴얼이나 POSIX 사양의 어디에서 볼 수 있나요?
사실이 아니기 때문에 갈 곳이 없습니다. POSIX는 파일 이름 완성 동작을 지정하지 않습니다.
두 번째 굵은 문단은 이전 문장에서 설명한 동작을 나타내지만 굵은 글씨로 표시하지 않았으며,POSIX 경로 이름 확인을 위해서는 a로 끝나는 경로를 /
디렉토리로 처리해야 합니다.가능하면 오류가 발생합니다. 굵은 글씨로 표시된 단락에서 이전에 관련 없는 문장을 참조하지 않습니다.
처음에는 명령(셸이 아님)이 명령줄 인수로 후행 슬래시가 있거나 없는 심볼릭 링크를 해석하는 방법에 따라 다르다고 생각했습니다.
실제로 이 옵션은 그 사실의 예입니다.