다음 스크립트를 실행해 보세요.
#!/bin/bash
mkdir a
mkdir a/asub
mkdir b
ln -sfr a/asub b/bsub
touch a/this_file_is_in_a
touch b/this_file_is_in_b
cd b/bsub
echo "I'm in directory: $(pwd)"
echo This is the contents of the upper directory:
ls ..
당신은 무엇을 얻기를 희망합니까? 아마도 디렉토리의 내용일 것입니다 b
. 그러나 그렇지 않습니다. 저는 그것을 디렉토리에서 실행했습니다 /tmp/bb
.
결과는 다음과 같습니다.
wzab@WZabHP:/tmp/bb$ ./ls_tester.sh
I'm in directory: /tmp/bb/b/bsub
This is the contents of the upper directory:
asub this_file_is_in_a
따라서 pwd
반환된 올바른 경로는 b
하위 디렉터리이지만 ".."는 하위 디렉터리를 나타냅니다 a
. 기호 링크에 대한 나의 이해가 올바르지 않습니까, 아니면 Linux의 버그입니까?
답변1
고려하면목차작은 파일로서 기본적으로 목록이나 테이블입니다.
디렉터리가 상위 디렉터리를 "알고 있는" 이유는 전체 디렉터리가 배후에서 사용되기 때문입니다. 편의를 위해 각 디렉토리에는 상위 디렉토리와 현재 디렉토리에 대한 링크가 있습니다.
디렉토리에 대한 심볼릭 링크는 파일에 대한 링크와 같습니다. 해당 링크된 디렉토리 "내부"에 있으면 해당 링크된 디렉토리에 있고 상위 디렉토리와 현재(실제) 디렉토리에 대한 하드 링크 ..
입니다 .
. 즉, 해당 심볼릭 링크(또는 어떤 심볼 링크)를 "통과"합니다. 정보는 "얻었습니다" "는 기술적으로 손실되었습니다.
이 세 개의 하드 링크는 적어도 Unixoidal 시스템에서는 새 디렉토리가 생성될 때 항상 생성됩니다(일부 이전 Unices는 임의의 하드 링크를 허용하지만).
하지만, 껍질에는 "편리한 설탕"이 많이 포함되어 있습니다. 쉘은 이것을 당신을 위해 기억할 것입니다실제로당신은 심볼릭 링크에서 왔으며 관련 디렉토리를 "다시 연결"합니다.
쉘 내장 기능 pwd
도 이를 알고 있으며 이런 방식으로 작동합니다. 애플리케이션은 /usr/bin/pwd
단순히 정규화된 경로를 선언합니다. 즉, 기호 링크를 통하지 않습니다. 그렇지 않은 경우 해당 디렉토리에 접근할 수 있는 방법은 다양하며 기술적으로 이러한 모든 조합(순환 심볼릭 링크가 있는 경우 무한할 수 있음)이 인쇄되어야 합니다.
대부분의 쉘 명령에는 심볼릭 링크를 통해 디렉토리에 들어갈 때 심볼릭 링크를 따르는 대신 물리적 디렉토리 구조를 사용하는 cd
옵션이 있습니다 . -P
당신은 할 수 있습니다"bash_buildins"에 대한 매뉴얼 페이지man cd
(내부를 통해 쉽게 접근 가능 bash
)
다음은 발췌 내용입니다 man zshbuiltins
.
-P 옵션을 지정하거나 CHASE_LINKS 옵션을 설정하면 기호 링크가 실제 값으로 확인됩니다. -L 옵션이 지정되면 CHASE_LINKS 옵션의 상태에 관계없이 기호 링크가 디렉토리에 남아 있으며 확인되지 않습니다.
(bash의 매뉴얼 페이지에도 비슷한 섹션이 포함되어 있습니다)
한 번 살펴보고 싶을 수도 있습니다진짜가장 작은 인클로저(예:s
. 일상적인 셸로 사용해야 한다고 제안하는 것은 아니지만 너무 작으며 명령 해석기가 실제로 제공하는 절대적으로 기본적인 기능 외에도 많은 운영 체제 도구에 의존합니다. 그런 점에서 이 책은 아주 좋은 교육 도구이다.