`~ / Documents`는 상대 경로입니까 아니면 절대 경로입니까?


37

이것은 단지 어휘 문제 일 뿐이지 만 계속 내 머리 속에 돌아가고 있습니다.

LPIC 준비 서적 의 연습 시험에서 비롯됩니다 . 이 책에 따르면 정답 ~/Documents은 홈 디렉토리에 상대적이므로 상대 디렉토리입니다.

그러나이 책은 오타와 실수가 훌륭하게 포함되어 있기 때문에 거기에 쓰여진 모든 것을 당연하게 받아 들일 수 없습니다. 여기서 나는 ~쉘에 의해 변수의 내용 $HOME이나 현재 사용자 홈 디렉토리 경로 (cf. man bash) 로 확장 된 변수 역할을 하므로 실제 경로 /home/myuser/Documents는 실제로 절대 디렉토리 이기 때문에 동의하지 않습니다 .

심지어 위키 백과 , 한번, (이 책이 하나 잘못되었는지 확인하려면 보인다하더라도)이 주제에 나에게 어떤 도움이 보인다

절대 또는 전체 경로는 현재 작업 디렉토리에 관계없이 파일 시스템에서 동일한 위치를 가리 킵니다. 그렇게하려면 루트 디렉토리를 포함해야합니다.

반대로 상대 경로는 특정 작업 디렉토리에서 시작하여 전체 절대 경로를 제공 할 필요가 없습니다.

여기서 다시 한 번 동의하지는 않습니다.이 정의에 따르면 /opt/kde3/bin/../lib현재 작업 디렉토리에 의존하지 않는 경로 는 절대 경로 여야하지만 이에 대한 현재의 이해는이 경로를 상대 경로로 만드는 책의 저자와 일치합니다.

웹스터 사전 에 따르면 빠른 웹 검색이 좌절감을 더하고 있습니다 .

절대 경로 -루트 디렉토리에 상대적인 경로입니다. 첫 문자는 경로 이름 구분자 여야합니다.

그래서 $HOME/Documents, 또는 단지 $HOME절대 디렉토리로 간주되지 않을 것이다? 아니면이 정의가 변수 확장을 의미합니까? 껍질의 ~성격은 어떻습니까? 어딘가에서 찾을 수있는 상대 대 절대 ​​디렉토리에 대한 신뢰할만한 정의가 있습니까?


7
모든 경로는 상대적이며 일부는 루트 디렉토리에만 의존하며 /절대 경로라고합니다. 따라서에서 시작 무엇을 모든 /I (이 경우에도 절대 부를 것이다 /usr/../etc)와 모든 다른 내가 전화 할 상대 ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). 요점은 현재 작업 디렉토리 또는 현재 사용자에 관계없이 절대적으로 작동해야한다는 것입니다. 상대는 일부 좁은 경우에만 작동 할 수 있습니다.
jimmij

6
사용자가 누구인지에 따라 경로가 다른 위치로 확장 될 수 있습니다. 내가 말했듯이, 이것은 여전히 ​​상대 경로가 아닌 절대 경로라고 생각합니다. 절대 경로와 상대 경로의 정의가 너무 정확하게 정의되어 있다고 생각하지는 않습니다. 이것은 수학이 아닙니다. 이 질문은 실제로 이해를 테스트하지는 않으며 무의미합니다.
Faheem Mitha

1
@FaheemMitha : LPIC 은 배포 중립 Linux 인증입니다. 인증 자체는 괜찮은 것처럼 보이지만,이 시험을 준비하기 위해 판매 된 (적어도 일부) 책에 관한 사례는
아닙니다

2
@jimmij : "상대적"은 경로의 맥락에서 특정한 기술적 의미를 지니고 있으며, 영어의 다른 의미를 사용하는 것은 나쁜 습관입니다. ~/foo상대 경로 를 부르는 것에 전적으로 동의하지 않습니다 . 당신이 얻는 것은 하드 코딩과 매개 변수화의 차이점입니다. 자세한 내용은 내 답변을 참조하십시오.
Peter Cordes

1
웹스터 사전의 정의는 정확하지만 매우 혼란 스럽다. 그러나 경로 ~/Documents와 같은 문자열 $HOME/Documents이 아니라는 것을 의미 합니다. 확장 후 경로를 식별 (절대)하지만 경로 자체는 아닙니다. 필자는 유닉스 / 리눅스 사용자가이 용어를 사용하는 데 동의하지만 이러한 문자열을 경로 자체라고도합니다.
reinierpost

답변:


41

저자가 문자 그대로의 문자열 (쉘 확장없이)을 경로로 말함으로써 당신을 사로 잡으려고한다면 상대 경로 ( mkdir -p './~/Documents')입니다. 그렇지 않으면:


그것은의 절대 경로 를 해결하는 프로세스의 현재 작업 디렉토리에 의존하지 않기 때문에. 상대 경로는 항상 프로세스의 작업 디렉토리를 기준으로합니다. 또는 심볼릭 링크의 위치에 대한 심볼릭 링크 대상의 경우. ( gcc -> gcc-5.2gcc -> /usr/bin/gcc-5.2). 이것은 NFS 마운트 및 다른 절대 경로를 통해 동일한 심볼릭 링크에 접근 할 수있는 다른 경우에 중요합니다. 예 :

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

데비안은 때로는 symlink를 ../../doc/whatever/whatever절대 symlink 대상 대신에 설치하기 때문에 NFS를 다른 곳에 마운트하거나 chroot를 사용하지 않고 볼 때 작동 chroot(8)합니다.

모든 유닉스 프로세스에는 고유 한 암호가 있습니다. pwd명령은 단지 그것을 인쇄하기 위해 존재한다.

POSIX 시스템 호출을 통한 디렉토리 변경에 대한 자세한 내용은 http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html 을 참조하십시오 .


다른 사람들이 말했듯 ~이 경로가 무엇이든 사용되기 전에 쉘에 의해 확장됩니다. ~/bin/myprog쉘 스크립트에서 사용하면 사용자마다 다르게 작동합니다. 차이 ~/bin/foo/home/peter/bin/foo그 중 하나는 다른 파라미터를 하였지만, 위치를 하드 코딩한다는 것이다. ~버전을 상대 경로 로 호출하는 것은 오류 (IMO) 입니다.

"환경 변수와 관련이있는"것에 대해 말하는 것은 혼란 스러울뿐입니다. 사용하는 상황에서 특정 기술적 의미가있는 다른 영어 의미의 용어를 사용하는 것은 좋지 않습니다.

손상된 시스템에서와 HOME=a/relative/path, ~/foo상대 경로로 확장됩니다. 이것은 사용 가능한 설정이 아닙니다.


3
이 답변에 감사드립니다. 그것은 가장 포괄적 인 것 같습니다. 나는 또한 저자가 정식 경로 의 개념 을 이것으로 잘못 혼합했다는 인상을 받았다 . /opt/kde3/bin/../lib예를 들어 잘못 상대 경로로 분류된다 : 그것은 절대 경로되지만 하지 정규 하나. 당신이 말했듯이, 이것은 모든 것을 혼란스럽게합니다. 명확한 설명과 NFS 관련 정보에 감사드립니다 :)!
WhiteWinterWolf

1
나는 시험 준비 서적을 작성하는 것이 그리 재미 있지 않으며, 일상적인 컴퓨팅에 유닉스 나 GNU / 리눅스를 사용하는 사람들은 그 책을 쓰는 사람들이 아니라는 결론을 내 렸습니다. 비 캐논이 아닌 경로 친척을 부르는 그 예는 정말 나쁘고 명백합니다. man7.org/linux/man-pages/man3/realpath.3.html (및 realpath(1))은 두 가지 작업을 모두 수행합니다. 정식화하고 절대적 (심볼릭 링크를 따름 )을 수행하면 혼동이 발생할 수 있습니다.
Peter Cordes

2
아직도, 그것들은 저에게 일상적인 개념 일뿐입니다. 내가 알고 있다고 말한 종이를 가지고있는 것이 이상하다고 생각한다. 그러나 종이를보고 싶어하는 모든 사람들에게 보여줄 @WhiteWinterWolf 종이를 얻는 것은 행운이다. :)
Peter Cordes

48

이것은 본질적으로 용어의 정의에 관한 질문입니다. 따라서 귀하의 목적에 따라 LPIC이 원하는 것은 정답입니다. 그러나 우리는 기술적 사실에 근거하여 결론을 내릴 수 있습니다.

당신이 통과되면 '~/Documents'A와 시스템 호출 , 정확히라는 이름의 디렉토리를 찾을 것입니다 ~현재 디렉토리에 (아마도 실패). 따라서 커널 에서 사용하는 경로 이름의 개념에 따르면 이것은 상대 경로입니다. 그러나 이것이 우리가 의도 한 것은 아닙니다.

~ (및 편의상 모방하는 다른 프로그램)에 의해 구현 된 구문 으로 실제 경로명으로 확장됩니다 . 설명하기 위해 ~/Documents대략 $HOME/Documents(셸 구문) 과 거의 동일 합니다. 이후 $HOME절대 경로이어야 의 값 $HOME/Documents 도 절대 경로이다. 그러나 우리가 의미하는 경로가 되려면 텍스트 $HOME/Documents또는 ~/Documents쉘로 확장해야합니다.

내가 정확하고 일관되고 싶었 따라서 경우, 그 말 것 ~/Documents입니다 절대 경로로 확장 쉘 스크립트의 조각.


물론, 커널은 무엇을 $HOME의미 하는지 모르는 것처럼 어떤 의미 인지 모를 것 ~입니다. 그러나 나는 확장이 쉘에 의해 수행된다는 주장을 발견한다. 대부분의 응용 프로그램은이를 지원하며, 쉘이 아닌 C 라이브러리를 가리 킵니다. 환경 변수 확장은 그러나 이다 쉘의 기능; $ HOME이 올바르게 설정된 쉘에서 LibreOffice를 시작한 경우에도 ~/somefile.odtLibreOffice에서 열 수 있습니다 $HOME/somefile.odt.
CVn

5
당신이 원하는 모든 것을 모호하게 찾을 수 있지만 C로 문서화 되어 있고 쉽게 확인하거나 반증해야합니다.
쓸모없는

6
다른 프로그램 ~은 유용한 단축키이기 때문에 쉘을 모방 하는 구문을 구현 합니다. 실제로 확장을 수행하는 라이브러리 함수가 있는지는 알지 못하지만 실제로 경로 이름을 사용하는 것과 별도로 수행되는 것입니다.
Kevin Reid

2
glob그리고 wordexp다른 것들 사이 틸드 확장을한다.
o11c

2
@ MichaelKjörling : 몇몇 프로그램은 ~확장을 구현합니다 . 대부분하지 않습니다. 예를 들어을 입력 ls -l ~하면 ls프로그램에서 ~문자를 볼 수 없습니다 . ls호출 되기 전에 쉘에 의해 확장 됩니다. 실제로 a ~를 전달 ls하면 특별히 취급하지 않습니다. 시도 ls -l '~(문자 그대로라는 이름의 파일 목록을 시도하는` ' ~).
Keith Thompson

16

귀하의 경우 $HOMEIS는 /home/white/, ~/Documents(동일 $HOME/Documents) 쉘에 의해 확장된다 ( 여기 에 대한 설명) /home/white/Documents이며, 절대 경로.

상대 경로가 시작되지 않는 하나 /같은 (이후 쉘 확장) ../Documents또는foo/bar

일부 오래된 쉘 확장하지 않는 ~(길을 bash, tcsh, zsh, 등 ... 할); 그들은 ~/Documents로 시작하는 상대 경로로 볼 수 있습니다 ~. 그러나 일반적으로 같은 디렉토리 이름이 없습니다 ~(그러나 mkdir '~'권장하지 않는 디렉토리 이름을 만들 수 있습니다 ).


어떤 쉘이 확장되지 ~
Edward Torvalds

3

절대 경로 에서 시작 /(그것은 고정되는 무엇을 말한다)와, 상대 경로 개시 현재 디렉토리에서 (및 현재 디렉토리 변경과 같은 변경을 지칭 무엇 때문에). 대부분의 쉘을 사용 ~즉, 현재 사용자의 홈 디렉토리에 대한 절대 경로의 약자로 시작 부분에, ~/Documents디렉토리입니다 Documents관계없이 현재 디렉토리가 될 일의 현재 사용자의 홈입니다. 따라서 절대 경로입니다.


1

사용자가 누구인지에 따라 경로가 다른 위치로 확장 될 수 있습니다. 내가 말했듯이, 이것은 여전히 ​​상대 경로가 아닌 절대 경로라고 생각합니다. 그러나 절대 경로와 상대 경로의 정의가 너무 정확하게 정의되어 있다고 생각하지 않습니다. 이것은 수학이 아닙니다. 이 질문은 내 생각으로는 실제로 이해를 테스트하지 않으며 무의미합니다.


정의는 의견 이상입니다. Wikipedia는 유닉스뿐만 아니라 일반적인 경우를 위해 그것을 찌릅니다
Peter Cordes

1

시작 부분에 ~ /를 사용하면 문서를 찾을 수 있기 때문에 현재 위치에 의존하지 않기 때문에 경로를 절대 경로로 만듭니다. 그러나 확장은 커널이 아닌 셸에 의해 수행되므로이 ​​구문을 인식하지 않는 셸 (예 : bash 별칭이 아닌 원래 Bourne 셸인 / bin / sh)을 사용하는 경우 운.

흥미롭게도 ~ / 대신 ~ root /를 사용하는 경우 $ HOME을 읽는 최적화는 일반적으로 적용되지 않으며 / etc / passwd가 올바른 경우 항상 절대 값으로 해결됩니다.


-1

이 책은 절대 경로는로 시작하는 경로 /이고 상대 경로는 다른 것으로 생각합니다.

당신은 볼 수 ..$HOME토큰의 유사한 유형으로. 경로가 절대 경로로 해석되기 전에 경로 구성 요소에 대해 둘 다 대체해야합니다.


3
어떻게 ..이런 건 $HOME? ..쉘 확장없이 시스템 호출로 직접 전달되는 경로의 시작 부분에있을 수 있습니다. 이러한 경로는 절대 경로가 아닙니다 . 여전히 프로세스 cwd 또는 symlink 위치와 관련이 있습니다. 저자가 리터럴 문자열 (쉘 확장없이)을 경로로 말함으로써 당신을 사로 잡으려고하지 않는 한. 나는 당신이 그 책에 대한 변명을하려고한다고 생각하지만, 그것이 잘못되었다고 말하고 사물을 흐트러 뜨리지 않도록하는 경향이 있습니다.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.