껍질은 집을 어떻게 아는가?

껍질은 집을 어떻게 아는가?

모든 쉘에는 환경 변수 $HOME 세트가 있습니다(예: /Users/lotolo). 내가 csh하에 있었다면 할 수 있었고 unsetenv HOME, 그랬다면 cd집에 있었을 것입니다. 나는 이것을 bash()에서도 테스트했는데 unset HOME동작은 동일합니다. 그렇다면 쉘은 my/other_user의 집이 어디에 있는지 어떻게 알 수 있습니까? 이 값은 어디에서 읽혀지나요?

내 질문은 수행 방법이 아니기 때문에 이것은 중복되지 않습니다.알아, 하지만 어떡하지?껍데기알다 HOME. 이 동작은 다른 사용자에게도 적용됩니다.

답변1

csh및 의 경우 tcsh쉘이 시작될 때 변수의 값을 기록합니다($HOME$home@JdeBP가 지적한 변수에서).

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

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

(그리고 대부분의 다른 Bourne 유사 쉘의 경우 bash) 나는 당신과 다른 동작을 봅니다.

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

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

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

따라서 일단 $HOME사라지면 다시 되돌릴 수 있는 확실한 방법이 없습니다.

셸을 실행하는 사용자와 동일한 uid를 가진 첫 번째 사용자의 홈 디렉터리를 찾기 위해 사용자 데이터베이스( getpwxxx()표준 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이 설정되지 않았다고 불평하거나 이를 /기본 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 ''

답변2

그렇다면 쉘은 my/other_user의 집이 어디에 있는지 어떻게 알 수 있습니까?

그러나 실제로는 그렇지 않습니다. 당신은 실험을 올바르게 수행하지 않았습니다. C 셸 매뉴얼에서 볼 수 있듯이 인수가 제공되지 않으면 cd명령이 변수 값을 변경합니다. home이 변수가 설정되지 않으면 디렉토리를 변경할 위치를 모르고 오류를 인쇄합니다.

기계: ~> 홈 페이지 설정 =/
머신: /home/users > cd
기계: ~> 홈 페이지 설정 해제
기계:/> CD
CD: 홈 디렉토리 없음
기계:/>

잘못된 변수를 설정 해제했습니다. 이는 HOME환경 변수 가 아니라 homeC 셸의 내부 변수입니다(셸이 시작될 때 해당 값으로 초기화되지만 그렇지 않으면 자체적으로 독립 변수임).

답변3

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

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

값을 변경할 수 있지만 .bashrc, .profile, .xinitrc 등과 같은 파일은 홈 디렉터리에 없으면 읽혀지지 않으므로 주의하세요.

관련 정보