디렉토리 및 상대 경로에 대한 심볼릭 링크 다음과 같은 트리가 있습니다. $ ls

디렉토리 (Blink)의 절대 경로로 symlink를 만들고 예를 들어 다음과 같은 트리가 있습니다.

$ 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 파일을 가져올 수 있습니까?



답변

나는 당신이 이것을 할 수 있다고 생각하지 않습니다. 오늘날 쉘은 파일 시스템과 OS에 의존하지 않고 현재 작업 디렉토리를 이름으로 추적합니다. 즉, 내장 된 cd“..”체인을 직접 따르는 것이 아니라 기호 링크를 “백업”할 수 있습니다.

그러나 실행할 때 ls ../foo, ls쉘이 심볼릭 링크를 따라 디렉토리에 도착 것을 인식하지 못합니다. ls을 할 것 stat()“../foo”에. “..”부분은 현재 디렉토리에서 가져옵니다. 여기에는 상위 항목에 대한 “..”항목이 하나만 있습니다. 전체 심볼릭 링크는 디렉토리가 단일 “.”을 갖는 방식을 변경하지 않습니다. 단일 “..”항목. 심볼릭 링크를 통해 커널은 파일 경로에 추가 간접 계층을 삽입 할 수 있습니다. “../whatever”를 open()or에 전달 stat()하면 커널은 프로세스의 현재 작업 디렉토리를 사용하여 “..”로 이름이 지정된 단일 디렉토리를 파악합니다.


답변

쉘은 현재 작업 디렉토리를에 저장합니다 $PWD. 이것이 쉘 내장 cd및에 사용 된 pwd것으로, 앞에서 본 것처럼 심볼릭 링크를 일반 디렉토리로 취급합니다. 때때로 이것은 도움이되고 때로는 도움이되지 않습니다.

다음을 사용하여 실제 디렉토리를 찾을 수 있습니다 pwd( help pwd자세한 내용은 type ).

$ 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

답변

브루스와 암스는 행동을 설명하는 아름다운 대답을했습니다. 그러나 실제로 ls ../foo당신이 요구 한 것을하기 위해, 당신은

ls $(dirname $PWD)/foo

답변

때문에, 그것을 할 수 /tmp/A/Blink 있다 실제로 /tmp/B. 그래서 ls ../A/foo작동합니다.

대신 유용 할 수있을 찾을 수 있습니다 CD 받는 실제 /tmp/B 오히려 별명보다, 디렉토리 /tmp/A/Blink. 그렇게하려면 대신 다음 함수를 사용할 수 있습니다 cd(.bashrc에 넣을 수 있음)

lcd() { cd $(readlink -f "$1"); }

lcd물론, 일반 및 심볼릭 링크 디렉토리 모두에서 작동합니다.
참고 : readlink -f링크의 최종 대상에 대해 작동합니다 (링크가 데이지 체인 인 경우).