참고 일부 있음 쉘 (특히 bash
)은 심볼릭 링크를 추적하여 주어진 디렉토리에 도착했는지 여부를 추적하고 이에 따라 현재 디렉토리를 인쇄합니다. 적어도 bash
는 물리적 또는 논리적 디렉토리 변경을 할 cd
에 옵션이 있습니다
cd [-L|-P] [dir]
변경 디렉토리에 현재 디렉토리를. HOME 변수가 기본 디렉토리입니다. [...]-P
옵션은 기호 링크를 따르는 대신 실제 디렉토리 구조를 사용합니다 (세트 내장 명령에 대한 -P
옵션 참조). -L
옵션을 사용하면 기호 링크를 따라야합니다. 인수가 -
이면 $ OLDPWD와 같습니다. CDPATH의 비어 있지 않은 디렉토리 이름이 사용되거나 -
이 첫 번째 인수이고 디렉토리 변경이 성공하면 새 작업 디렉토리의 절대 경로 이름이 표준 출력에 기록됩니다. 디렉토리가 성공적으로 변경되면 리턴 값은 true입니다. 그렇지 않으면 false. /usr/spool
다음 /var/spool
에 대한 심볼릭 링크입니다 표시된 시나리오에서
:
$ pwd
/
$ cd /usr/spool/uucppublic
/usr/spool/uucppublic
$ cd -L ..
/usr/spool
$ cd /usr/spool/uucppublic
/usr/spool/uucppublic
$ cd -P ..
/var/spool
$
대부분의 사람들은, 일반 cd ..
는 cd -L ..
과 동일 할 것입니다. 원하는 경우 bash
을 cd -P ..
과 동일하게 (set -P
또는 set -L
을 사용하여) 선택할 수 있습니다.
현재 디렉토리의 경로 이름을 찾는 프로세스도 이해해야합니다. 논리적으로 프로세스 (커널)는 현재 디렉토리 (.
)를 열고 inode 번호 (및 장치 번호)를 읽습니다. 그런 다음 상위 디렉토리 (..
)를 열고 일치하는 inode 번호 (및 장치 번호)가있는 항목을 찾을 때까지 항목을 읽습니다. 그런 다음 경로 이름의 마지막 구성 요소를 제공합니다. 루트 디렉토리 (여기서 .
과 ..
에 대한 inode 번호가 같고, 다음 디렉토리의 디렉토리 번호가 같을 때까지 다음 디렉토리의 inode 번호를 찾고 부모 디렉토리 (../..
) 등을 열어 프로세스를 반복 할 수 있습니다. 값은 통상적으로 2)이다. 이것은 심지어 마운트 지점에서 작동합니다. 자동 마운트 된 원격 (NFS) 파일 시스템을 조심하십시오. 위의 순진한 검색 개요가 올바른 기계를 찾을 때까지 모든 기계를 마운트하기 때문에 수백 개의 자동 마운트 된 기계가있는 디렉토리를 통해 스캔하면 실제로 느려질 수 있습니다. 따라서 실제 getcwd()
함수는 이보다 더 명확하지만 현재 디렉토리의 경로를 찾는 방법을 설명합니다. 또한 /var/spool/uucppublic
아래의 디렉토리를 평가할 때 프로세스가 /usr/spool
을 발생시키지 않는 이유를 보여줍니다. /usr
디렉토리를 열지 않습니다.
realpath()
함수 (시스템 호출)는 아마도 심볼릭 링크를 참조하는 이름을 취하고 심볼릭 링크를 전혀 포함하지 않는 이름으로 해석합니다. /usr/spool/uucppublic
을 전달하면 예를 들어 /var/spool/uucppublic
을 반환합니다.
+1 : 저는 bash의 (IMO 이상한) 행동을 알지 못했습니다. –
@Jonathan Leffler 우수 작품! bash의 동작을 어떻게 알 수 있습니까? –