~는 $HOME이지만 가끔은요?

~는 $HOME이지만 가끔은요?

CD ~

와 같은 일을한다

cd $HOME

이는 다음과도 같습니다.

cd /home/tandu

하지만,

cd ~not-tandu

변경 사항/home/not-tandu

이것은 순전히 구문론적인 선택입니까? 커널(또는 실행 파일)은 이를 어떻게 처리합니까? 다른 모든 항목이 생략된 경우 슬래시를 추가하는 cd특별한 경우가 있습니까 ? ~즉, 동일한 디렉토리로 변경하지만 ~/한 디렉토리 위에 있습니다. 변경하는 다른 디렉토리에 대해서도 마찬가지입니다.~~a

답변1

~$HOME여러 쉘에서 제공되는 별칭이지만 $HOME더 보편적입니다. $HOME실제로 여기에 환경 변수 HOME을 삽입(대체)하도록 쉘에 요청합니다. 대체할 수 있는 다양한 환경 변수가 많이 있습니다. env목록을 실행해 보세요. ~단어의 시작 부분에 있지 않으면 항상 인식되지는 않습니다 . 비교를 위해 다음 두 명령을 사용해 보세요.

ls /~
ls /$HOME

첫 번째는 루트 디렉터리에서 /~호출된 파일을 보려고 시도하는 ls 실행 파일에 전달되고, 두 번째는 확장 되어 명령줄 인수로 ls 실행 파일에 전달됩니다. 모든 POSIX 시스템(POSIX는 UNIX 및 Linux 시스템 작동 방식에 대한 표준)에서는 여러 슬래시를 하나의 슬래시와 동일하게 처리할 수 있으므로 . passwd 파일에서 사용자 이름을 조회하고 홈 디렉토리를 반환하도록 쉘에 지시하는 바로 가기입니다. 동등한 환경 변수가 없습니다. 이러한 대체는 모두 쉘에 의해 수행되며 대부분 지원되지만, 다음과 같은 환경 변수만 모든 쉘에서 지원된다는 것이 보장됩니다. 또한 실제로 내장된 명령입니다. 이는 쉘 자체에 디렉토리를 변경하라고 지시하는 특수 지시어입니다. 이는 쉘 프로세스의 기본 속성을 변경하는 데 사용되기 때문에 별도의 실행 파일로 구현할 수 있는 다른 쉘 내장 기능과는 다릅니다 . 는 성능상의 이유로 단순히 내장된 셸이지만, 예전 UNIX에서는 자체 실행 파일로만 사용할 수 있었습니다 .~$HOME//home/user//home/user/home/user~username$HOMEcdechoecho/bin/echo

답변2

~foo'사용자 foo의 홈 디렉토리'를 의미합니다.

이는 커널에 의해 수행되는 것이 아니라 쉘에 의해 해석됩니다. 쉘이 ~foo인수로 볼 때마다 이를 사용자의 홈 디렉토리로 투명하게 대체 foo하고 그 자리에 전달합니다. 따라서 실행하면 cd ~tandu쉘이 실제로 실행됩니다 cd /home/tandu.

답변3

~그 뒤에는 사용자 이름이 해당 사용자의 홈 디렉터리로 확장됩니다.

관련 정보