pwd와 /bin/pwd의 이상한 차이점

pwd와 /bin/pwd의 이상한 차이점

현재 디렉토리에 심볼릭 링크를 추가했습니다 ln -s . aa. 를 실행 cd aa한 다음 실행 하면 pwd응답은 입니다 /home/sim/aa.

하지만 실행하면 /bin/pwd인쇄됩니다 /home/sim(현재 디렉터리는 변경되지 않았습니다).

이 차이는 어디에서 오는가?

답변1

Bash를 포함한 대부분의 쉘에는 pwd내장 쉘이 있습니다.

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

사용하는 경우 내장과 동일한 결과를 얻으려면 /bin/pwd-L옵션을 사용해야 합니다 pwd.

$ ln -s . test
$ cd test && pwd
/home/cuonglm/test
$ /bin/pwd
/home/cuonglm
$ /bin/pwd -L
/home/cuonglm/test

기본적으로 /bin/pwd기호 링크는 무시되고 실제 디렉토리가 인쇄됩니다.

~에서info pwd:

`-L'
`--logical'
     If the contents of the environment variable `PWD' provide an
     absolute name of the current directory with no `.' or `..'
     components, but possibly with symbolic links, then output those
     contents.  Otherwise, fall back to default `-P' handling.

`-P'
`--physical'
     Print a fully resolved name for the current directory.  That is,
     all components of the printed name will be actual directory
     names--none will be symbolic links.

pwd기본적으로 내장 기능에는 -P이 옵션을 사용 하지 않거나 -o physical내장 기능 설정이 활성화되지 않은 한 기호 링크가 포함됩니다.

~에서man bash:

pwd [-LP]
              Print the absolute pathname of the  current  working  directory.
              The pathname printed contains no symbolic links if the -P option
              is supplied or the -o physical option to the set builtin command
              is  enabled.  If the -L option is used, the pathname printed may
              contain symbolic links.  The return status is 0 unless an  error
              occurs  while  reading  the  name of the current directory or an
              invalid option is supplied.

답변2

프로세스는 이 질문에 대한 답을 제공하기에는 너무 복잡한 방법을 사용하여 파일 시스템을 조사하여 현재 작업 디렉터리를 결정할 수 있습니다. 이것이 pwd프로그램과 getcwd라이브러리 기능의 목적입니다. Unix 초기에는 작업 디렉토리를 찾는 유일한 방법이었습니다. 다음은 다른 답변이나 이 사이트의 다른 어느 곳에서도 찾을 수 없는 귀하의 질문에 대한 부분 답변입니다(검색 42초 후).

  • 쉘이 시작되면 현재 작업 디렉토리를 얻습니다(아마도 를 호출하여 getcwd).
  • cd이후에는 , pushd또는 를 실행할 때마다 popd쉘이 실행됩니다.문자열 조작 기능을 사용하는 작업 디렉토리. 예를 들어,

    • 작업 디렉토리가 이고 /home/sim를 입력하면 cd ..쉘은 작업 디렉토리가 임을 알아냅니다 /home.
    • 작업 디렉토리가 이고 /home/sim를 입력하면 cd .쉘은 작업 디렉토리가 여전히 임을 알아냅니다 /home/sim.
    • 작업 디렉토리가 이고 /home/sim를 입력하면 cd aa쉘은 작업 디렉토리가 심볼릭 링크인지 /home/sim/aa확인하지 않고 작업 디렉토리가 무엇인지 알아냅니다.aa

    이는 통화의 "비용"을 절약하기 위해 수행됩니다 getcwd. 하지만 이는 잘못된 정보로 이어질 수 있으므로 절충안입니다.

  • (내장) 명령은 pwd단순히 기억/계산된 작업 디렉터리에 대한 쉘의 아이디어를 표시합니다.
  • 추가적으로, 쉘은 작업 디렉토리의 기억/계산된 개념을 PWD 환경 변수에 넣습니다.편리한사용자 프로세스. 프로세스에 정확한 정보가 필요한 경우 절대 이에 의존해서는 안 됩니다.

따라서 결론은 쉘이 위치에 대해 혼란을 겪을 수 있다는 것입니다. 그러나 를 입력하면 /bin/pwd쉘의 작업 디렉터리 개념에 액세스할 수 없는 별도의 프로세스에서 실행되므로 실제 작업 디렉터리 자체를 구식 방식으로 결정하게 됩니다. (예외: /bin/pwd프로그램할 수 있는PWD 환경 변수를 살펴보면 분명히 이를 지정하면 이 작업이 수행됩니다 -L. ) 쉘이 어떻게 혼동될 수 있는지에 대한 또 다른 예는 다음과 같습니다.

cd /home/sim/aa #/home, /home/sim및 는 모두 실제 디렉토리(심볼릭 링크가 아님) 라고 가정합니다 /home/sim/aa
#.
pwd #출력: /home/sim/aa, 맞습니다.
mv ../aa ../bb
pwd #출력: /home/sim/aa, 이는 올바르지 않습니다.
/bin/pwd #출력: /home/sim/bb, 맞습니다.


그리고 이에 대해 명확하지 않은 경우를 대비해 ln -s . aaand 를 입력하면 cd aa현재 작업 디렉터리변경 없음, 입력할 때 수행하는 작업보다 더 많은 작업을 수행합니다 cd .. 왜냐하면 기본적으로 입력할 때 수행하는 작업이기 때문입니다 cd aa.

관련 정보