`~ / Documents`는 상대 경로입니까 아니면 절대 경로입니까? 여기서 나는 ~쉘에 의해 변수의 내용 $HOME이나

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

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

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

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

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

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

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

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

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

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



답변

저자가 문자 그대로의 문자열 (쉘 확장없이)을 경로로 말함으로써 당신을 사로 잡으려고한다면 상대 경로 ( 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상대 경로로 확장됩니다. 이것은 사용 가능한 설정이 아닙니다.


답변

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

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

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

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


답변

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

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

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


답변

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


답변

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


답변

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

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


답변

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

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