pwd와 .는 현재 경로를 다르게 결정합니까?

pwd와 .는 현재 경로를 다르게 결정합니까?

주로 pwd내장되어 있지 않지만 .bash 쉘에 내장되어 있기 때문입니까?

예를 들어, 다음 예에서는 서로 다릅니다.

/tmp/ttt$ mv ../ttt ../tttt
/tmp/ttt$ pwd
/tmp/ttt
/tmp/ttt$ cd .
/tmp/tttt$

답변1

.Bash(또는 다른 쉘)에 내장되어 있지 않습니다. 각 디렉토리에는 항목 .... 임의의 디렉토리에 CD를 넣고 실행하여 이를 확인할 수 있습니다 ls -lia. .및 항목이 표시됩니다 ... lsinode 번호를 얻으 려면 '-i' 플래그를 사용하라고 요청했습니다 . 해당 .합계를 적어 두십시오 ... 한 디렉토리 위로 이동하되 cd ..또는 cd /something/soemthingelse/whatever. 다시 할 ls -lia. inode 번호는 .첫 번째 목록의 inode 번호와 동일합니다. ..각 디렉토리는 "." 및 ".."라는 이름의 디렉토리로 생성됩니다. 이 "." 항목의 inode 번호는 상위 디렉토리의 디렉토리 이름과 동일합니다. ".." 항목은 항상 상위 디렉토리입니다. 이렇게 하면 ls -li /"."과 ".."이 동일한 값을 갖는 것을 볼 수 있습니다.

이 규칙을 사용하면 현재 디렉터리를 참조하기 위해 특수한 코드가 필요하지 않습니다. 이름은 항상 "."입니다. 특수 케이스 코드 "디렉토리로 이동"이 필요하지 않습니다. 항상 ".."입니다. 유일한 특별한 경우는 루트 및 네트워크 마운트 파일 시스템입니다. 파일 시스템 루트에는 "."과 ".."가 동일한 inode 번호를 가지며 차이가 없습니다. 네트워크에 마운트된 파일 시스템은 마운트 지점에서 연속되지 않은 inode 번호를 가지며 해당 동작은 원격 파일 시스템이 무엇인지와 이를 마운트하는 데 사용된 프로토콜에 따라 달라집니다.

프롬프트 변경의 경우 을 호출하면 mv ../ttt ../tttt실제로 쉘의 작업 디렉토리 이름이 변경됩니다. 이를 수행하기 전에 작업 디렉토리를 확인하는 쉘 명령을 호출하지 않으므로 이전 이름이 중간에 보고 cd .됩니다 .pwd/tmp/tt

답변2

Bash를 사용한다고 가정하면pwd내장 1cd 처럼 명령이 쉘을 트리거하여 현재 디렉토리에 대한 정보를 업데이트하는 일이 발생합니다 . cd쉘은 실행하기 전에 현재 디렉토리가 변경되지 않았다고 생각하므로 새 경로를 얻으려고 시도하지 않습니다.

그건 그렇고, Gnouc를 조금 확장하려면답변, 오픈그룹 기본사양 제6호환경 변수설명하다:

PWD [...]은 현재 작업 디렉터리의 절대 경로 이름을 나타내야 합니다. 점 또는 점-점 파일 이름 구성 요소를 포함해서는 안 됩니다. 값은 다음에 의해 설정됩니다.cd유용.

반면에 외부 /bin/pwd명령을 실행하면 현재 디렉터리의 새 이름을 얻게 됩니다. 왜 이런 일이 발생합니까? 이것pwd명령은 다음에서 비롯됩니다.핵심 도구환경 변수에 대해 일부 온전한 검사를 수행 PWD하고 유효하지 않은 경우 인쇄하지 않습니다. 자세한 내용은 소스 코드에서 확인할 수 있습니다.logical_getcwd기능(coreutils 버전 8.23부터).

현재 디렉터리의 정식 경로를 얻는 데 사용할 수 있는 또 다른 명령은 readlink -f . 2 입니다 .

[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ mv ../ttt ../tttt
[ciupicri@host ttt]$ pwd
/tmp/ttt
[ciupicri@host ttt]$ /bin/pwd
/tmp/tttt
[ciupicri@host ttt]$ readlink -f .
/tmp/tttt

1 회 실행으로 type pwd이를 확인할 수 있습니다.

2 에서링크 읽기맨 페이지: 지정된 이름을 가진 모든 구성 요소의 모든 기호 링크를 반복적으로 추적하여 표준화 -f되었습니다 --canonicalize. 마지막 구성 요소를 제외한 모든 구성 요소가 존재해야 합니다.

답변3

pwd$PWD점이 없는 .절대 경로 이름이나 점-점을 포함하는 경우 값이 인쇄됩니다 ... POSIX에서비밀번호정의:

-L
    If the PWD environment variable contains an absolute pathname of the 
    current directory that does not contain the filenames dot or dot-dot, 
    pwd shall write this pathname to standard output. Otherwise, if the PWD 
    environment variable contains a pathname of the current directory that 
    is longer than {PATH_MAX} bytes including the terminating null, and the 
    pathname does not contain any components that are dot or dot-dot, it is 
    unspecified whether pwd writes this pathname to standard output or 
    behaves as if the -P option had been specified. Otherwise, the -L option 
    shall behave as the -P option.

기본적으로 옵션이 pwd사용되므로 사용 시 설정된 -L현재 값이 인쇄됩니다 . 현재 디렉터리를 새 경로로 변경 하면 아무 것도 변경되지 않으므로 이전 경로 이름을 얻게 됩니다.PWDcdmvPWD

올바른 새 경로 이름을 얻을 수 있는 몇 가지 방법이 있습니다.

  • 사용 -P옵션:pwd -P
  • 사용 /proc:ls -l /proc/self/cwd

노트

변수로서의 POSIX 정의장애인PWD, 및 의 동작은 응용 프로그램이 값을 설정하거나 설정 해제하는 경우 지정되지 않습니다.cdpwd

% cuonglm at /tmp/ttt
% PWD=/home/cuonglm
% cuonglm at ~
% pwd
/tmp/ttt
% cuonglm at ~
% pwd -P
/tmp/ttt

관련 정보