![`~/Documents`는 상대 경로입니까 아니면 절대 경로입니까?](https://linux55.com/image/70560/%60~%2FDocuments%60%EB%8A%94%20%EC%83%81%EB%8C%80%20%EA%B2%BD%EB%A1%9C%EC%9E%85%EB%8B%88%EA%B9%8C%20%EC%95%84%EB%8B%88%EB%A9%B4%20%EC%A0%88%EB%8C%80%20%EA%B2%BD%EB%A1%9C%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
그냥 단어장인데 머리속에 계속 맴돌더라구요.
연습 시험에서 나온 거야선형 PIC책을 준비하세요. 책에 따르면 정답은 이것이 ~/Documents
홈 디렉토리에 상대적이기 때문에 상대 디렉토리라는 것입니다.
하지만 이 책에는 오타와 오류가 너무 많아서 그 안에 적힌 내용을 당연하게 여길 수가 없습니다. 나는 여기에 동의하지 않습니다. 왜냐하면 ~
이것은 쉘에 의해 변수의 내용이나 $HOME
현재 사용자의 홈 디렉토리에 대한 경로로 확장된 변수 역할을 하기 때문입니다(참조:man bash
), 따라서 실제 경로는 /home/myuser/Documents
실제로 절대 디렉터리입니다.
심지어위키피디아, 이번에는 이 주제에 대해 나에게 아무런 도움이 되지 않는 것 같습니다(비록 해당 주제에 대한 책이 틀렸다는 것을 확인하는 것 같지만).
절대 또는 전체 경로는 현재 작업 디렉터리에 관계없이 파일 시스템의 동일한 위치를 가리킵니다. 이렇게 하려면 루트 디렉터리가 포함되어 있어야 합니다.
이와 대조적으로 상대 경로는 지정된 작업 디렉터리에서 시작하므로 완전한 절대 경로를 제공할 필요가 없습니다.
여기서도 나는 동의하지 않습니다. 이 정의에 따르면 /opt/kde3/bin/../lib
현재 작업 디렉터리에 의존하지 않는 경로는 절대 경로여야 하지만 이에 대한 현재 이해는 경로를 상대 경로로 만드는 책의 저자와 일치합니다.
빠른 웹 검색이 내 좌절감을 더했다고 합니다.메리엄-웹스터 사전:
절대 경로- 루트 디렉터리에 대한 상대 경로입니다. 첫 번째 문자는 경로 이름 구분 기호여야 합니다.
그렇다면 절대 디렉토리로 간주되지 않습니까 $HOME/Documents
? $HOME
아니면 이 정의가 변수 확장을 의미합니까? 그렇다면 Shell의 ~
성격은 어떨까요 ? 상대 디렉토리와 절대 디렉토리에 대한 확실한 정의를 어딘가에서 찾을 수 있습니까? 내가 그동안 틀렸던 걸까?
답변1
이것은 본질적으로 용어 정의에 관한 질문입니다. 따라서 귀하의 목적에 따라 대답은 LPIC가 원하는 것입니다. 그러나 우리는 기술적인 사실을 바탕으로 몇 가지 결론을 내릴 수 있습니다.
'~/Documents'
으로 넘어가면시스템 호출~
, 현재 디렉터리에서 전체 이름이 지정된 디렉터리를 찾습니다(실패할 수 있음). 그래서 사용된 경로명의 개념에 따라핵심, 이는 상대 경로이지만 이는 우리가 의미하는 바가 아닙니다.
~
구문은 다음과 같이 구현됩니다.껍데기(및 편의상 이를 모방하는 기타 프로그램)확장하다실제 경로명이 됩니다. 설명하자면 ~/Documents
(다시 말해 쉘 구문)과 거의 동일 합니다 . 절대 경로여야 하므로 $HOME/Documents
,$HOME
의 가치 $HOME/Documents
또한 절대 경로입니다. 그러나 우리가 참조하는 경로가 되려면 텍스트가 셸에 의해 확장되어야 $HOME/Documents
합니다 .~/Documents
따라서 정확하고 일관되게 말하고 싶다면 ~/Documents
그렇다고 대답하겠습니다.절대 경로로 확장되는 쉘 스크립트 조각입니다.
답변2
작성자가 리터럴 문자열(셸 확장 없이)을 경로로 취급하여 사용자를 유혹하려는 경우 상대 경로( mkdir -p './~/Documents'
)입니다. 그렇지 않으면:
이것은절대 경로, 구문 분석은 프로세스의 현재 작업 디렉터리에 의존하지 않기 때문입니다. 상대 경로항상 프로세스의 작업 디렉터리를 기준으로 표현됩니다. 또는 심볼릭 링크 대상의 경우 심볼릭 링크를 기준으로 한 위치입니다. ( gcc -> gcc-5.2
비교 gcc -> /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.
데비안은 때때로 절대 심볼릭 링크 대상이 아닌 에 심볼릭 링크를 마운트하므로 ../../doc/whatever/whatever
NFS가 다른 곳에 마운트되거나 ing을 사용하지 않고 chroot를 볼 때 chroot(8)
작동합니다 .
각 Unix 프로세스에는 자체 cwd가 있습니다. 이 pwd
명령은 단지 인쇄하기 위해 존재합니다.
바라보다: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html POSIX 시스템 호출을 사용하여 디렉터리를 변경하는 방법에 대한 추가 정보입니다.
다른 사람들이 말했듯 ~
이 경로는 어떤 목적으로 사용되기 전에 셸에 의해 확장됩니다. 쉘 스크립트에서 이를 사용하면 ~/bin/myprog
사용자마다 다르게 작동합니다. ~/bin/foo
와 의 차이점은 /home/peter/bin/foo
하나는 위치를 하드코딩하고 다른 하나는 위치를 매개변수화한다는 것입니다. 버전을 상대 경로라고 부르는 것은 ~
잘못되었습니다(IMO) .
"환경 변수와 관련된" 것에 대해 이야기하는 것은 혼란스럽습니다. 사용하는 맥락에서 특정한 기술적 의미를 갖는 용어에 대해 다른 영어 의미를 사용하는 것은 나쁜 습관입니다.
손상된 시스템에서는 사용이 상대 경로로 HOME=a/relative/path
확장됩니다 . ~/foo
이는 단순히 사용할 수 있는 설정이 아닙니다.
답변3
귀하의 $HOME
것이 /home/white/
이면 ~/Documents
(와 동일 $HOME/Documents
) 셸에 의해 확장됩니다(참조여기설명을 듣기 위해) 에 /home/white/Documents
, 이것은순수한길.
상대 경로는 또는 /
와 같이 (셸 확장 후)로 시작하지 않는 경로 입니다.../Documents
foo/bar
일부 오래된 쉘은 확장되지 않습니다 ~
(예 bash
: tcsh
, , zsh
등). ;로 시작하는 상대 경로로 처리됩니다 ~/Documents
. ~
그러나 일반적으로 그러한 디렉토리 이름은 없습니다 (그러나 권장하지 않는 을 ~
사용하여 디렉토리 이름을 만들 수 있습니다 ).mkdir '~'
답변4
사용자가 누구인지에 따라 경로가 다른 위치로 확장될 수 있습니다. 그러고 보니 이 경로는 상대 경로가 아닌 절대 경로인 것 같습니다. 그러나 절대 경로와 상대 경로가 그렇게 정확하게 정의되어 있지는 않다고 생각합니다. 이것은 수학이 아닙니다. 내 생각에는 이 질문은 실제 이해력 테스트가 아니며 무의미합니다.