Bash에서 심볼릭 링크를 사용하여 다시 CD를 올리고 내리는 방법은 무엇입니까?

Bash에서 심볼릭 링크를 사용하여 다시 CD를 올리고 내리는 방법은 무엇입니까?

구조:

/base/
   +- somedir/
   +- symlink/  -> /some_other_dir

이 명령(내 Makefile 제외)은 실패합니다.

cd /base/symlink
ls ../somedir

Bash는 ../somedir이 존재하지 않는다고 불평합니다. 마찬가지로 some_other_dir의 ../somedir을 참조하는 makefile이 실패합니다. 그러나 cd ..는 예상대로 작동합니다. 내 쉘이 논리적으로 작동하도록 할 수 있나요?

답변1

..현재 디렉토리의 디렉토리 항목입니다. 상위 디렉토리에 대한 하드 링크입니다. /base/symlink/..은 실제로 와 동일한 파일 이며, ( 그 자체가 다른 곳으로의 심볼릭 링크가 아닌 한) /some_other_dir/..그렇습니다 ./some_other_dir

대부분의 셸에서는 디렉터리 항목 으로 처리되지 않는다는 점에서 특별한 cd처리가 수행되지만, 발생하는 경우 (시스템의 경로 이름 확인 대신) 첫 번째 수준 디렉터리를 삭제하는 것으로 해석 됩니다.......cd

예를 들어 에서 cd a/b/..셸은 를 chdir("a")실행하는 대신 를 실행합니다 chdir("a/b/.."). 후자를 얻으려면 다음을 수행해야 합니다 cd -P a/b/...

cd이는 다음에만 적용된다는 점을 인식하는 것이 중요합니다.일부쉘), (IMO, 잘못된 특성), ls그렇지 않거나 vi다른 것(예:다른 것cd없이 이러한 경로를 전달하는 이러한 쉘에 대한 스크립트입니다 -P.

그 껍질 속에 cd그게 어디 있지 ?논리적설명 .., pwd내장 함수 및 $PWD변수는 다음과 같습니다.논리적실제(물리적) 디렉터리가 아닌 현재 디렉터리, 즉 심볼릭 링크 디렉터리 구성 요소가 있을 수 있는 디렉터리입니다. 마찬가지로, pwd -P다음을 사용하여 얻을 수 있습니다.물리적작업 목록.

이제 하고 싶다면

cd /A/b
anything-but-cd ../c

실제로 의미하는 바는 다음과 같습니다.

anything-but-cd /A/c

/A/b심볼릭 링크인지 아닌지에 관계없이 다음을 수행할 수 있습니다.

anything-but-cd "$(dirname -- "$PWD")/c"

또는

anything-but-cd "${PWD%/*}/c"

또는 다음을 사용하여 zsh:

anything-but-cd $PWD:h/c

/*마지막 3초를 제거하려면 $PWD:

anything-but-cd "${PWD%/*/*/*}/c" # POSIX
anything-but-cd $PWD:h:h:h/c      # zsh

관련 정보