로 현재 디렉토리에 심볼릭 링크를 추가했습니다 ln -s . aa
. 내가 실행 cd aa
하고 그 후에 내가 실행 pwd
하면 응답은 /home/sim/aa
입니다.
그러나 내가 실행 /bin/pwd
하면 인쇄됩니다 /home/sim
(현재 디렉토리는 변경되지 않았습니다).
이 차이는 어디에서 오는가?
로 현재 디렉토리에 심볼릭 링크를 추가했습니다 ln -s . aa
. 내가 실행 cd aa
하고 그 후에 내가 실행 pwd
하면 응답은 /home/sim/aa
입니다.
그러나 내가 실행 /bin/pwd
하면 인쇄됩니다 /home/sim
(현재 디렉토리는 변경되지 않았습니다).
이 차이는 어디에서 오는가?
답변:
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
것을 제외하고 기본적으로 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.
/bin/pwd
기본적으로 symlink를 무시 info pwd
하고 내 대답 부분 을 읽으십시오 . 현재 디렉토리의 완전한 이름을 인쇄하십시오. 즉, 인쇄 된 이름의 모든 구성 요소는 실제 디렉토리 이름 이되고 기호 링크는 없습니다.
set -o physical
이제 기본적으로 옵션으로 pwd
사용됩니다. -P
옵션이 없으면 -L
경로에 symlink가 어떻게 포함되어 있습니까? https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
무엇을 알 수 있는지 이것을 읽으십시오 set -o physical
.
프로세스가 파일 시스템을 조사하여 현재 작업 디렉토리를 판별하는 것은이 질문에 대한 답변으로 주제에 대해 너무 복잡하지 않은 방법을 사용하여 가능합니다. 이것이 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
(내장) 명령은 단순히 작업 디렉토리가 무엇인지 쉘의 기억 / 계산 개념을 표시합니다.결론은 쉘이 어디에 있는지 혼동 될 수 있다는 것입니다. 그러나을 입력 /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
.
-L
이상의 비용을 절감 - 및 $PWD
사용자 정의 POSIX가 지정한 환경 변수입니다 - 사용자 공간 애플리케이션이 아마해야 그것을 신뢰 (그것이 의미하는 것은 무엇 ...?) . 어쨌든, 나는 symlinks의 팬이 아니지만, 그들과 함께 선택 해야하는 미친 방향으로 간접적으로 지시하는 것은 사용자의 특권입니다. 그게 무엇 -L
보다 중요합니다.