
디렉터리에 대한 절대 경로(Blink)를 사용하여 심볼릭 링크를 만들었으며 예를 들어 다음 트리가 있습니다.
$ ls -l /tmp/A
total 0
lrwxrwxrwx 1 root root 6 Apr 3 12:27 Blink -> /tmp/B
-rw-r--r-- 1 root root 0 Apr 3 12:27 foo
$ ls -l /tmp/B
total 0
-rw-r--r-- 1 root root 0 Apr 3 12:27 bar
그런 다음 /tmp/A로 이동하여 디렉토리를 Blink로 변경합니다.
$ cd /tmp/A
$ pwd
/tmp/A
$ cd Blink
$ pwd
/tmp/A/Blink
cd ..
나에게 반환 /tmp/A
하지만 예를 들어 입력하면 ls ../foo
오류가 발생합니다.
ls: ../foo: No such file or directory
내장 cd 명령은 필요에 따라 경로를 확인하지만 외부 ls는 ..을 /tmp/B의 상위 레벨로 간주하므로 foo를 찾을 수 없습니다.
여기서 문제는 무엇입니까? ../foo와 같은 상대 경로를 사용하여 /tmp/A/Blink에서 foo 파일을 가져올 수 있나요?
답변1
쉘은 현재 작업 디렉토리를 $PWD
. 이것이 쉘 내장 cd
및 에 사용되는 것이며 pwd
, 본 것처럼 심볼릭 링크를 일반 디렉토리로 처리합니다. 이는 도움이 될 때도 있고 그렇지 않을 때도 있습니다.
다음을 사용하여 실제 디렉터리를 찾을 수 있습니다 pwd
( help pwd
자세한 내용을 보려면 입력하세요).
$ pwd
/tmp/A/Blink
$ pwd -L
/tmp/A/Blink
$ pwd -P
/tmp/B
마찬가지로 다음과 cd
같은 옵션이 있습니다 -P
(다시 말하지만 help cd
친구입니다).
$ cd /tmp/A/Blink
$ pwd
/tmp/A/Blink
$ cd -P ..
$ pwd -P
/tmp
마지막으로 "기능"을 완전히 끌 수 있습니다:
$ set -P
$ cd /tmp/A/Blink
$ pwd
/tmp/B
답변2
나는 당신이 이것을 할 수 없다고 생각합니다. 요즘 쉘은 현재 위치를 어떻게 얻었는지 추적하고 파일 시스템과 OS에 의존하기보다는 이름으로 현재 작업 디렉토리를 추적합니다. 이는 내장된 기능이 cd
".." 체인을 직접 따르기보다는 기호 링크를 "백업"할 수 있음을 의미합니다.
그러나 을 실행할 때 는 ls ../foo
쉘 ls
이 기호 링크를 따라 디렉토리에 도달했다는 것을 인식하지 못합니다. "../foo"에서 ls
작업을 수행합니다 . stat()
".." 부분은 현재 디렉터리에서 나오며, 상위 디렉터리에 대한 ".." 항목이 하나만 있습니다. 전체 심볼릭 링크는 디렉토리가 단일 "."를 갖는 방식을 변경하지 않습니다. 단일 ".." 항목이 있습니다. 기호 링크를 사용하면 커널이 파일 경로에 추가 간접 계층을 삽입할 수 있습니다. "../whatever"를 open()
or 에 전달하면 stat()
커널은 호출을 수행하는 프로세스의 현재 작업 디렉터리를 사용하여 ".."로 명명된 단일 디렉터리를 알아냅니다.
답변3
Bruce와 ams는 뒤에 있는 행동을 설명하는 아름다운 답변을 제공했습니다. 하지만 실제로 ls ../foo
요청한 작업을 수행하려면 다음과 같이 갈 수 있습니다.
ls $(dirname $PWD)/foo
답변4
넌 할 수 없어 왜냐하면/tmp/A/Blink
~이다실제로 /tmp/B
. 그래서 ls ../A/foo
작동합니다.
대신에 다음을 수행하는 것이 유용하다고 생각할 수도 있습니다.CD~로진짜 /tmp/B
별칭이 아닌 /tmp/A/Blink
. 그렇게 하려면 cd
(.bashrc에 넣을 수 있는) 대신 다음 함수를 사용할 수 있습니다.
lcd() { cd $(readlink -f "$1"); }
lcd
는 물론 일반 디렉토리와 기호 링크 디렉토리 모두에서 작동합니다.
참고: readlink -f
링크의 최종 대상에 대해 작동합니다(링크가 데이지 체인으로 연결된 경우).