내가 있는 디렉토리는 심볼릭 링크입니다.
me@hostname:/home/me$ ls -al
the_link -> actual_a
actual_a
actual_b
actual_c
me@hostname:/home/me$ cd the_link
me@hostname:/home/me/the_link$
이제 셸을 열면 다른 프로세스에서 심볼릭 링크를 에서 the_link -> actual_a
또는 the_link -> actual_b
그 이상으로 변경합니다 rm -rf actual_a
. 쉘에서 명령을 실행하면 이상한 일이 발생합니다. cd
내가 있는 디렉토리로 "re-cd"하라고 지시할 수 있는 방법이 있나요 ?
분명 난 할 수 있어
me@hostname:/home/me/the_link$ cd ..
me@hostname:/home/me$ cd the_link
그런데 명령어 하나로 할 수 있나요?
답변1
cd .
당신에게 적합할 수도 있습니다. 그렇지 않다면 당연히
cd ../folder
폴더와 지정된 폴더로 이동합니다.
답변2
pwd
일부 셸에는 추적할 수 있는 내장 버전이 있습니다 cd
. 반면에 이 /bin/pwd
명령은 현재 지점에서 루트 노드까지 파일 시스템을 탐색하고 디렉터리 경로를 생성하여 파일 시스템의 실제 위치를 결정합니다.
이를 사용하여 현재 위치에 대한 디렉터리 경로를 얻은 다음 새로운 현실에 맞게 디렉터리를 강제로 변경할 수 있습니다.
cd "$(/bin/pwd)"
예
mkdir /tmp/x
cd /tmp/x
# In another terminal
mkdir /tmp/y
mv /tmp/x /tmp/y/z
pwd # "/tmp/x" - where the shell thinks you are
/bin/pwd # "/tmp/y/z" - where you actually are
cd "$(/bin/pwd)"
pwd # "/tmp/y/z"
..
분명히 일부 프로세스가 현재 있는 디렉터리를 삭제하면 더 이상 루트 디렉터리에 대한 경로가 없기 때문에 작동하지 않습니다 .
답변3
내가 취할 접근 방식은 cd
심볼릭 링크의 전체 경로를 얻는 것입니다. 이렇게 하면 항상 링크가 가리키는 실제 디렉터리로 이동하게 됩니다.
링크가 존재하지 않는 디렉터리를 가리키는 경우 오류를 잡아야 합니다. 그것은 다음과 같습니다:
base_path=/home/me
link_name=the_link
link_path="${base_path}/${link_name}"
cd ${link_path} || {
echo "$0: Could not change directory to ${link_path}: Exiting"
exit 2
}
답변4
그냥 해:
cd -- "$PWD"
(부족 cd -L -- "$PWD"
).
$PWD
POSIX 쉘에서 업데이트된 현재 작업 디렉토리를 추적합니다 cd
. 거기에 심볼릭 링크가 유지됩니다. 그래서 당신은 the_link
가리키는 새 디렉토리 로 끝납니다 .
반면에:
cd -P .
현재 작업 디렉터리에 남아 있지만 $PWD
기호 링크 구성 요소 없이 표준 절대 경로를 포함하도록 업데이트됩니다. 현재 디렉터리가 삭제된 경우 이는 도움이 되지 않으며 동작은 셸마다 다릅니다.