현재 디렉토리에 심볼릭 링크를 추가했습니다 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 . aa
and 를 입력하면 cd aa
현재 작업 디렉터리변경 없음, 입력할 때 수행하는 작업보다 더 많은 작업을 수행합니다 cd .
. 왜냐하면 기본적으로 입력할 때 수행하는 작업이기 때문입니다 cd aa
.