구조:
/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