명령 줄에서 실제로 심볼릭 링크 위치에 있는지 확인하는 방법은 무엇입니까?


33

폴더가 있다고 가정하십시오.

cd /home/cpm135/public_html

상징적 인 링크를 만들

ln -s /var/lib/class .

나중에 그 디렉토리에 있습니다.

cd /home/cpm135/public_html/class

pwd내가 말해 줄 것입니다/home/cpm135/public_html/class

내가 "정말"에 있다는 것을 알 수있는 방법이 /var/lib/class있습니까? 감사



1
일부 쉘은 실제로 심볼릭 링크 내부에 있도록 허용하지 않습니다. 예를 들어 fish쉘은 심볼릭 링크를 자동으로 분석합니다 cd.
trysis

답변:


56

pwd명령 구성 방법에 따라 기본적으로 symlink 위치 를 표시하는 논리적 작업 디렉토리 (로 출력 pwd -L) 또는 symlink를 무시하고 "실제"디렉토리를 표시하는 실제 작업 디렉토리 (로 출력 pwd -P)가 표시 될 수 있습니다.

완전한 정보를 위해 할 수있는 일

file "$(pwd -L)"

심볼릭 링크 안에서는

/path/of/symlink: symbolic link to /path/of/real/directory

1
예, -P깃발은 내가 필요한 것입니다. 감사합니다
Oliver Williams

6
또한 제목, 단지 사용의 질문에 대답하려면 test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(또는 교체 && echo No symlinks와 함께 || echo Symlinks).
CVn

1
이것은 에코 할 필요없이 질문에 완벽하게 대답합니다. '심볼릭 디렉토리에있을 경우 메시지를 어떻게 표시합니까?'라는 질문이 있으면 에코가 필요합니다.
Arronical

file "$(pwd)"symlink가 마지막 디렉토리 구성 요소 인 경우에만 작동합니다. CD를 CD에 넣으면 OP의 심볼릭 링크를 감지하지 못합니다 /home/cpm135/public_html/class/foo/bar. 나는 모든 경로 이름에 심볼릭 링크,하지만 당신은 또한 사용할 수 있습니다에 대한 인쇄 정보 것을 아무것도 잘 모르는 것 같아요 realpath .내 생각에 동등하다pwd -P
피터 코르

17

참고 pwd실제로 내장 쉘입니다. 쉘과 구성에 따라 결과가 변경 될 수 있습니다. 보다 편리한 솔루션을 위해서는을 사용해야 /bin/pwd합니다. 매뉴얼 페이지의 스 니펫 :

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

일반적으로을 사용하여 파일 / 디렉토리의 전체 표준 경로를 확인할 수 있습니다 readlink -f. readlink -f .와 비슷하게 작동합니다 pwd -P.


2
readlink -f모든
Unices

3

당신은 정말로 있습니다 /home/cpm135/public_html/class- "현재 작업 디렉토리는 무엇입니까"에 대한 유일한 정답입니다.

당신이 언급 할 때 /var/lib/class... 그것은 실제로 당신이 어디에 있는지 에 관한 것이 아니라 거기도착한 경로 에 관한 입니다.

당신이 실행할 때 /bin/pwd, 그것은을보고 현재 작업 디렉토리를 알아냅니다. 및 .. 디렉토리 (상단에 나열된 디렉토리 ls -la)를 사용하여 .. 디렉토리와 일치하는 디렉토리를 찾습니다. 그런 다음 .. 및. 동일한 디렉토리를 참조하십시오. 모든 작업이 완료되면 현재 작업 디렉토리가 무엇인지 알게됩니다.

pwd쉘 내장 을 실행할 때이 절차를 따르지 않습니다 (필요한 경우 일부를 수행 할 수도 있음). 대신 여기에 도달 한 경로를 기억합니다. 따라서 cd명령 을 수행 할 때마다 쉘은 현재 위치를 찾기위한 경로의 일부로 기억하고 수행 한 pwd모든 cd명령을 기반으로 계산 한 것을 인쇄 합니다-실제 또는 아닐 수도 있습니다 작업 디렉토리.

당신이하고 foo에 ln -s . foo계속 cd들어가면 상황이 정말 이상해질 수 있습니다 - /bin/pwd당신은 여전히 ​​같은 디렉토리에 pwd있다고 말할 것입니다. 그러나 셸 내장 은 /foo/foo/foo/foo/foo/foo실제로 존재하지는 않지만 쉘에 내장되어 있다고 말할 것 입니다. (그렇다고 할 수 있습니다 cd .)

디렉토리 이름을 바꾸면 혼란의 또 다른 원인이 있습니다. /bin/pwd그런 다음 변경 사항을 즉시 포착하지만 기본 pwd디렉토리 이름은 중요하지 않은 것을 수행 할 때까지 내장 기능 이 작동하지 않습니다.


1
당신은 질문에 대답하지 않고, 당신은 그것을 기각하고 있습니다.
Dmitry Grigoryev

4
이 질문에 직접 대답하지는 않지만 셸의 pwd내장 기능 의 차이점을 이해하고 /bin/pwd독립형 버전이 더 유용한 정보를 제공하는 방법을 설명하는 데 유용한 게시물이라고 생각합니다 (원래 질문에 대답 할 수 있음).
Anthony G-Monica에 대한 정의

1
이러한 차이점은 모두 다른 답변에서 언급 한 -P-L옵션으로 요약됩니다. 간단히 말해서, 일부 구현은 기본적으로 하나, 다른 일부는 다른 구현입니다. Centos 시스템에서 bash의 내장 기능은 기본적으로 논리적으로 설정되어 /bin/pwd있으며 물리적으로 기본 설정되어 있지만 둘 다 명령 행 옵션을 허용하고 주어진 결과에 동의합니다.
IMSoP

1
이 질문은 잘못된 전제를 바탕으로합니다. '/ var / lib / class에서'정말 '인지 알 수있는 방법이 있습니까?' 그것은 ... 그것이 정말로 의미하는 바를 설명함으로써, 그가 정말로 찾고있는 것을 이해하는 데 도움이됩니다. pwd -P 및 -L 옵션은 이미 언급되었습니다 ...
dougmc

1
당신은 당신의 주장이 거꾸로 있습니다. ls ..의 내용이 /var/lib아닌로 표시 /home/cpm135/public_html됩니다. cd ..쉘은 "어떻게 도착했는지"에 대한 특별한 추적을 수행하며 실제로 chdir("..")시스템 호출을 수행하지는 않습니다 . 커널에 관한 한, 쉘의 현재 작업 디렉토리 ( /proc/self/cwd)는 마운트 포인트 : 노드 쌍입니다. 디렉토리의 열린 파일 디스크립터와 같으므로 디렉토리 이름을 바꾸어도 쉘이 손상되지 않습니다. ( cd .$PWD변수 를 업데이트하기 위해 ). 당신은 유용한 지적을하고 있습니다. 그래서 나는 고칠 때 이것을 찬성했습니다
Peter Cordes

1

기본적으로 현재 작업 디렉토리의 실제 경로를 표시할지 묻습니다. 글쎄, 파이썬과 os.getcwd()함수가 있습니다

아래에 보이는 것은 내 홈 디렉토리에있는 "VirtualBox VMs"디렉토리 내에서의 작은 테스트입니다. 실제로는 다른 하드 드라이브에 위치한 다른 디렉토리에 대한 심볼릭 링크 /mnt/HDD입니다.

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

보시다시피, 파이썬 os.getcwd()은 symlink의 경로가 아닌 디렉토리의 실제 경로를 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.