저는 UNIX 계열 시스템에서 경로 확인 프로세스를 에뮬레이트하려고 합니다(man 페이지 path_solution 참조).
내 운영 체제는 GNU coreutils 8.7이 설치된 Linux입니다.
해결 방법에서 추가 후행 "/"의 의미를 명확히 하기 위해 셸에서 다음을 수행했습니다.
mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link
this_is_link는 심볼릭 링크인데 방금 삭제했기 때문에 모든 것이 괜찮습니다. 하지만 시도할 때:
mkdir this_is_dir
ln -s this_is_dir this_is_link
rm this_is_link/
그것은 울려 퍼졌다rm: cannot remove 'this_is_link/': Is a directory
글쎄요, 후행 "/"로 인해 심볼릭 링크가 따라오게 되는 것 같습니다. 그래서 다른 명령을 시도했습니다.rmdir this_is_link/
흥미로운 결과가 나왔습니다:rmdir: failed to remove 'this_is_link/': Not a directory
내가 기대했던 것과는 다릅니다. 그래서 나는 친구에게 자신의 시스템에서도 동일한 결과를 얻을 수 있는지 확인해 달라고 요청했습니다. 그의 coreutils 버전은 내 버전보다 낮습니다. 그리고 그 결과는 놀랍습니다,rm
또는 상관없이 rmdir 'this_is_link/'
동일한 오류 가 발생합니다.Not a directory
.
다른 친구가 방금 Mac OS에서 시도해 보았고 결과는 다음과 같습니다.rm
=> '디렉토리입니다', rmdir
=> 디렉토리가 성공적으로 삭제되고 링크가 유지됩니다..
관련 사양이 있나요?정밀한경로 확인 동작?
답변1
이것POSIX/싱글 유닉스 사양후행 슬래시로 지정된 경로 이름은 디렉토리를 참조해야 합니다(참조:기본 정의 §4.11 경로 이름 확인). 실제로 는 (파일 이름을 조작할 때가 아니라 경로 확인 목적으로 사용되며 후행 슬래시 는 무시됩니다) foo/
과 동일하게 정의됩니다 . 대부분의 구현에서는 이를 존중하지만 몇 가지 예외가 있습니다.foo/.
basename
dirname
이는 동작을 설명합니다 . 인수가 분명히 디렉터리인 rm this_is_link/
와 동일합니다 .rm this_is_link/.
rmdir this_is_link/
디렉토리도 비슷하게 참조되어야 합니다. 컴퓨터에 이 기능이 없다는 것은 GNU coreutils의 버그입니다. OSX는 여기에서 정상적으로 작동합니다.
답변2
내 관점 에선:
- ''rm link/''는 rm이 마지막 문자를 보고 그것이 슬래시임을 확인하고 여러분이 보는 (실제로 정확하지는 않은) 진단을 제공하기 때문에 실패합니다.
- ''rmdir link/'' 실패: 링크는 디렉토리가 아니고 심볼릭 링크입니다.
- 'rm link''는 올바르게 성공합니다.
그런데, 경로 확인은 이것과 아무런 관련이 없습니다. 단지 "rm"이 인수에 대해 (정확하게) "stat"를 호출하는 대신(rmdir이 수행하는 작업) 바로가기를 사용하는 것처럼 보입니다.
건배.