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


15

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

그러나 내가 실행 /bin/pwd하면 인쇄됩니다 /home/sim(현재 디렉토리는 변경되지 않았습니다).

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

답변:


17

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

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

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

$ 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것을 제외하고 기본적으로 symlink 를 포함 합니다.-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.

나는 그 차이가 어디에서 왔는지 잘 모르겠다
user3581976

/bin/pwd기본적으로 symlink를 무시 info pwd하고 내 대답 부분 을 읽으십시오 . 현재 디렉토리의 완전한 이름을 인쇄하십시오. 즉, 인쇄 된 이름의 모든 구성 요소는 실제 디렉토리 이름 이되고 기호 링크는 없습니다.
cuonglm

@ user3581976 : 내 업데이트를 더 명확하게 참조하십시오.
cuonglm

pwd에 대해 -L 명령이 왜 기본적으로 설정되어 있습니까? 쉘은 / bin / pwd 명령을 사용하여 pwd를 실행하지 않습니까?
user3581976

2
@ user3581976 :으로 시작하는 이미지는 set -o physical이제 기본적으로 옵션으로 pwd사용됩니다. -P옵션이 없으면 -L경로에 symlink가 어떻게 포함되어 있습니까? https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html무엇을 알 수 있는지 이것을 읽으십시오 set -o physical.
cuonglm

7

프로세스가 파일 시스템을 조사하여 현재 작업 디렉토리를 판별하는 것은이 질문에 대한 답변으로 주제에 대해 너무 복잡하지 않은 방법을 사용하여 가능합니다. 이것이 pwd프로그램과 getcwd라이브러리 기능이하는 일입니다. 유닉스 초기에는 작업 디렉토리가 무엇인지 알아내는 유일한 방법이었습니다. 귀하의 질문에 대한 답변의 일부는 다른 답변이 나이 사이트의 다른 곳에서도 찾을 수 없습니다 (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 . aa하고 cd aa, 다음 현재 작업 디렉토리가 변경되지 않았 더 이상 당신이 입력 않을 때보다, cd .- 당신이 입력 할 때 당신이 무슨 일을하는지 본질적이다 그 때문에 cd aa.


고마워, 아주 좋은 대답, 이것은 내가 기다리고 있었던 것이다;)
user3581976

2
이 대답은 약간 구부러진 것 같습니다 . 이 개에의 -L이상의 비용을 절감 - 및 $PWD사용자 정의 POSIX가 지정한 환경 변수입니다 - 사용자 공간 애플리케이션이 아마해야 그것을 신뢰 (그것이 의미하는 것은 무엇 ...?) . 어쨌든, 나는 symlinks의 팬이 아니지만, 그들과 함께 선택 해야하는 미친 방향으로 간접적으로 지시하는 것은 사용자의 특권입니다. 그게 무엇 -L보다 중요합니다.
mikeserv

1
이것은 대답이되어야합니다 (심볼릭 링크는 문제의 핵심이 아닙니다).
Thomas Dickey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.