나는 소벨의 책을 읽고 있어요Linux 명령, 편집기 및 셸 프로그래밍에 대한 실용 가이드,4e. 이전에 그는 작업 디렉토리와 작업 디렉토리의 상위 디렉토리의 "경로 이름에 대한 동의어"에 대해 이야기 .
하고 말했습니다. ..
내 질문은 이를 상대 경로 이름이나 절대 경로 이름의 동의어로 간주해야 하는지입니다. 마지막으로, 내 오해는 Linux 시스템이 경로 이름을 해결하는 방법을 이해하지 못하는 것과 관련이 있다고 생각합니다.
예: 다음 명령을 입력한다고 가정합니다.
cd ..
현재 작업 디렉토리의 상위 디렉토리의 절대 경로 이름을 ..로 바꾸는 것으로 쉘을 처리해야 합니까? 아니면 상대 경로 이름을 지정하면 "해상도"가 다르게 동작합니까(여기서는 슬래시 /로 경로를 시작하지 않기 때문에 그런 것 같습니다)? 어떤 면에서 이 질문은 "모든 상대 경로 이름이 적절한 절대 경로로 대체되므로 상대 경로 이름 지정은 절대 경로 이름 지정의 특별한 경우입니까?"로 공식화될 수 있을 것 같습니다.
답변1
.
..
이는 작업 디렉토리와 작업 디렉토리의 상위 디렉토리의 "경로 이름 동의어"임을 의미합니다 .
이것은 단순화입니다. 이는 대부분의 경우에 해당되지만 항상 그런 것은 아닙니다. 대부분의 경우 현재 디렉토리가 이면 /one/two/three
와 동일 하며 와 동일 cd .
합니다 . 마찬가지로, 와 동등 하고 동등합니다 .cd /one/two/three/.
cd /one/two/three
cd ..
cd /one/two/three/..
cd /one/two
ls .
ls /one/two/three
ls ..
ls /one/two
동등성은 쉘에 의존하지 않습니다. 이는 .
문제 해결의 핵심 작업의 일부 입니다 ..
. 역사적으로 .
는 ..
실제로는 일반적인 디렉터리 항목이었으며 커널에는 경로 탐색에서 이러한 항목을 처리할 코드가 없었습니다. .
및의 유일한 특수 코드는 ..
모든 디렉터리에 자동으로 생성되며 수정하거나 삭제할 수 없다는 것입니다. 최신 시스템은 .
및 ..
디렉토리 항목을 저장하지 않는 경향이 있지만 대신 경로 탐색 코드에서 특수 처리 기능을 사용합니다.
외부 명령에 경로를 전달해도 쉘이 문제를 해결하지 못하는 것을 확인할 수 있습니다 .
...
$ echo ..
..
$ ls ../s*
../somefile ../someotherfile
위에서 쓴 것처럼 상대 경로를 확인하는 것은 대부분의 경우 절대 경로를 지정하는 것과 동일하지만 전부는 아닙니다. 예를 들어 다음과 같은 애플리케이션을 실행할 수 있습니다.
디렉터리 및 파일을 만듭니다.
drwx------ 4 root root 4096 Jan 1 12:00 /some drwx------ 2 myapp root 4096 Jan 1 12:00 /some/where -rwx------ 1 myapp root 4096 Jan 1 12:00 /some/where/myfile
루트로서 디렉토리로 변경합니다
/some/where
.사용자의 권한을 포기하십시오
myapp
.응용 프로그램은
myfile
and 에 액세스할 수 있지만 탐색할 수 있는 권한이 없기 때문에 or 에는./myfile
액세스할 수 없습니다 ./some/where/myfile
../where/myfile
/some
.
이는 및 가 아닌 동일한 파일에 대한 경로 간의 동등성에 대한 일반적인 제한 사항입니다 ..
.
..
셸에서 내부적으로 처리되는 특별한 경우가 있습니다 . cd
명령(및 관련 명령, 예를 들어 pushd
)의 경우 셸 자체는 /dir/..
아무것도 압축되지 않습니다. 여기에는 cd ..
현재 디렉토리를 마치 쉘인 것처럼 처리하는 것이 포함됩니다. 이것은 일반적으로 인간에게 더 친화적인 것으로 간주됩니다. 특히 후속 조치를 통해 시작한 곳으로 돌아갈 수 있습니다. 이는 심볼릭 링크와 관련하여 의미가 있습니다. 동일한 디렉토리의 하위 디렉토리에 대한 심볼릭 링크인 경우 현재 디렉토리가 아닙니다. 해당 디렉토리의 상위 디렉토리입니다.cd /one/two
/one/two/three
cd foo
cd ..
link
link/..
표적의 link
. 이를 "논리적" 현재 디렉토리 추적이라고 하며 일부 쉘에서 쉘 옵션을 사용하거나 설정하여 "물리적" 현재 디렉토리 추적(쉘이 특별한 처리를 수행하지 않음 ..
) 으로 전환할 수 있습니다.cd -P
답변2
내 질문은 이것을 상대 경로 이름 또는 절대 경로 이름의 동의어로 간주해야 하는지입니다.
이 단계를 건너뛰고 다른 디렉터리처럼 똑바로 생각하는 것이 좋습니다.예귀하와 관련된 모든 방식으로(귀하가 커널 또는 파일 시스템 모듈 개발자가 아닌 경우)
Giles의 답변은 훌륭하며 특별히 잘못된 점은 없습니다.
즉, "."를 보는 것이 확실히 가능하고 유용합니다. 그리고 ".."는 습지 표준 디렉토리입니다. 스크립트나 애플리케이션에서 무엇을 하든 디렉토리처럼 작동합니다(Giles가 말했듯이 과거 어느 시점에는 실제로 디렉토리였습니다).
가장 중요한 것은 컨셉을 유지해야 한다는 것입니다.인덱스 노드와는 별개로디렉토리 항목당신의 마음 속에. inode는 파일 시스템에서 "무언가"가 저장되는 위치(상당히 물리적인 방식, 즉 디스크 블록)를 설명합니다. 이것디렉토리 항목사람이 읽을 수 있는 이름, 해당 인덱스 노드, 속성, 날짜 등을 포함하는 보다 추상적인 표현입니다.
ㅏ목차이러한 항목을 나열하기 위한 일부 표현이 포함된 내부 처리 파일이면 그 자체로 문제가 없을 수 있습니다(물론 이는 단순화되었습니다). 중요한 것은 실제 상황이다.저장관련 정보가 있는 장소와 매우 분리되어 있음어디저장되었습니다.
다음을 입력하면 해당 디렉터리의 inode(첫 번째 열)를 볼 수 있습니다.
~/tmp$ ls -ilaO
total 8
16326296 drwxr-xr-x 8 me staff - 256 Jan 15 14:02 .
1129613 drwxr-xr-x+ 112 me staff - 3584 Jan 19 17:25 ..
16326815 drwxr-xr-x 2 me staff - 64 Jul 27 2020 a_directory
126333718 -rw-r--r-- 1 me staff - 0 Jan 15 14:07 a_file
tmp
"위층"으로 이동하면 상위 디렉토리에 어떻게 표시되는지 확인할 수 있습니다 .
~$ ls -ilaO -d tmp
16326296 drwxr-xr-x 8 me staff - 256 Jan 15 14:02 tmp
tmp
예상대로 상위 디렉토리의 in 은 .
inside 와 동일한 inode를 가리킵니다 tmp
.
.
상위 디렉토리를 확인하십시오 .
~$ ls -ilaO -d .
1129613 drwxr-xr-x+ 112 me staff - 3584 Jan 19 17:25 .
이는 상위 디렉토리의 inode가 .
예상대로 하위 디렉토리 항목의 inode와 동일함을 보여줍니다...
시스템의 다른 디렉토리 이름을 사용할 수 있는 거의 모든 위치에서 및를 사용할 수 있습니다 .
. ..
어쨌든 이는 내가 사용하는 명령이 어떤 이유로(예: 보안상의 이유로 - 웹 서버가 경로에 절대 포함될 수 없도록 강제하여 ..
누군가가 보안 규칙을 "탈출"할 수 없도록) 특수 논리를 구현하고 무언가를 입력하기 때문입니다. 비밀번호 파일을 얻으려면 URL http://domain/index.html/../../../../etc/passwd와 같습니다.
다른 프로그램(예: bash
)에는 일종의 특수 매직 핸들 ".."이 있을 수 있습니다. 예를 들어, bash를 실행하면 cd ..
현재 경로가 가 /where/i/was/before/..
아니라는 것을 알 수 있습니다 /where/i/was
. 이는 쉘에 대해 생각하는 방법에 대한 질문에 대한 답변입니다. 쉘이 달성하고 싶다고 생각하는 작업을 수행하여 더 쉽게 만드는 것을 상상할 수 있습니다. 특별한 논리가 없는 다른 프로그램은 ..
일반적으로 경로의 어느 곳에서나 쉽게 ..
작동할 수 있으며 행복하게도 이를 인식하지 못할 것입니다...
예다른 경로명과 같은 경로명입니다.
답변3
.
..
커널에서 구문 분석이 발생합니다. 경로를 따라 내려가면 커널은 dnode 항목을 초기화합니다. 현재 디렉토리 dnode 항목에는 상위 디렉토리 dnode 항목에 대한 포인터가 있습니다.
보시다시피, 파일 시스템 코드는 여기서 아무런 역할을 하지 않습니다. 다른 곳에서 참조하기 위해 디렉토리 ..
항목을 손상시킨 경우 실제로 이 컨텐츠를 볼 수 있는 유일한 방법은 직접 제작한 NFSv2 클라이언트를 통해서입니다. 이것은 매우 사실입니다. 파일 시스템이 손상되고 디렉터리에 대한 경로가 두 개 있는 경우에도 ..
여전히 잘 작동하며 입력한 경로를 따르게 됩니다.
일부 쉘은 cd ..
경로에서 마지막 구성 요소를 텍스트로 제거하여 특수 처리를 수행합니다. 이는 현재 디렉토리 경로가 심볼릭 링크일 때 다른 동작을 발생시킵니다. 쉘은 어떤 인수가 파일 이름 인수이고 ..
glob 패턴이 아닌지 알지 못합니다 . echo ..
이는 반환된 결과를 실행하고 관찰하면 쉽게 알 수 있습니다.
출처: 석사 논문 파일링 시스템을 개발했습니다.