쉘은 집을 어떻게 알 수 있습니까? 그래도 나는 cd내 집에있을 것입니다.

각 쉘에는 환경 변수 $ HOME 세트 (예 :)가 /Users/lotolo있습니다. 내가 csh에 있다면 나는 할 수 unsetenv HOME있고 여전히 그래도 나는 cd내 집에있을 것입니다. 나는 이것을 bash ( unset HOME) 에서도 테스트 했으며 동일한 동작입니다. 그렇다면 쉘은 내 / other_user가 어디에 있는지 어떻게 알 수 있습니까? 그 값을 어디에서 읽습니까?

내 질문은 내가 어떻게 알지 못하기 때문에 복제본은 아니지만 은 어떻게 알 수 HOME있습니다. 그리고이 행동은 다른 사용자들에게도 확대됩니다.



답변

의 경우 cshtcsh, 상기의 값을 기록한다 $HOME(쉘이 시작되었을 때 변수 는에 $home@JdeBP 의해 명시된 변수 ).

시작하기 전에 설정을 해제하면 csh다음과 같은 내용이 표시됩니다.

$ (unset HOME; csh -c cd)
cd: No home directory.

대한 bash(그리고 본쉘의 다른 대부분의), 나는 당신보다 다른 동작을 참조하십시오.

bash-4.4$ unset HOME; cd
bash: cd: HOME not set

$HOME변수 의 내용은 사용자 이름 에 대한 사용자 데이터베이스에 저장된 정보를 기반으로 로그인 프로세스에 의해 초기화됩니다 .

사용자 이름 자체에 대한 정보가 항상 사용 가능한 것은 아닙니다. 모든 쉘은 프로세스를 실행하는 프로세스의 사용자 ID이며 다른 홈 디렉토리를 가진 여러 사용자가 동일한 사용자 ID를 공유 할 수 있음을 알 수 있습니다.

따라서 일단 $HOME사라지면 믿을만한 방법이 없습니다.

getpwxxx()쉘을 실행하는 것과 동일한 uid를 가진 첫 번째 사용자의 홈 디렉토리에 대한 사용자 데이터베이스 ( 표준 API로)를 쿼리하는 것은 근사치 일뿐입니다 (사용자 데이터베이스가 변경 될 수 있다는 사실은 말할 것도없고 홈입니다). 로그인 세션이 시작된 이후 디렉토리를 일회성 값으로 정의).

zsh 내가 아는 유일한 껍질은 다음과 같습니다.

$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697)      = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++

내가 시도한 다른 모든 쉘은 설정되지 않은 HOME에 대해 불평하거나 /기본 홈 값으로 사용 합니다.

그러나 다른 동작은입니다. fish있는 $USER경우 저장된 사용자 이름에 대해 데이터베이스를 쿼리 하거나 그렇지 않은 getpwuid()경우 다음과 같습니다.

$ env -u HOME USER=bin ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwnam("bin")  = 0x7fd2beba3d80
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
--- SIGCHLD (Child exited) ---
/bin
+++ exited (status 0) +++


$ env -u HOME -u USER ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwuid(1000, 0x7f529eb4fb28, 0x12d8790, 0x7f529e858697) = 0x7f529eb51dc0
fish->getpwnam("chazelas")                                      = 0x7f529eb51d80
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
/home/chazelas
+++ exited (status 0) +++

사용자가 존재하지 않는 경우 SEGV ( https://github.com/fish-shell/fish-shell/issues/3599 ) :

$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault  env -u HOME USER=foo fish -c ''


답변

그렇다면 쉘은 내 / other_user가 어디에 있는지 어떻게 알 수 있습니까?

그렇지 않습니다. 실험을 제대로 수행하지 않고 있습니다. C 쉘 매뉴얼에서 볼 수 있듯이 cd명령이 home인수없이 제공 되면 변수 값으로 변경됩니다 . 이 변수가 설정되어 있지 않으면 디렉토리를 어디에서 변경해야하는지 모르고 오류를 인쇄합니다.

기계 : ~> 집으로 설정 = /
기계 : / 홈 / 사용자> cd
기계 : ~> 집으로 설정 해제
기계 : /> cd
cd : 홈 디렉토리 없음
기계 : /> 

잘못된 변수를 설정 해제했습니다. 그것은 HOME환경 변수 가 아니며 homeC 쉘의 내부 변수입니다 (쉘이 시작될 때 전자의 값에서 초기화되지만 그렇지 않으면 자체의 독립 변수).


답변

시스템은 로그인시 HOME 변수를 사용자 홈 디렉토리의 경로 이름으로 설정했습니다. 설정

  • 그래픽 세션의 경우 gdm, kdm 또는 xdm.
  • 콘솔, 텔넷 및 rlogin 세션에서 로그인
  • SSH 연결을위한 sshd

.bashrc, .profile, .xinitrc 등이 ​​홈 디렉토리에 없으면 읽을 수 없으므로 값을 변경할 수 있지만주의를 기울이십시오.


답변