모든 쉘에는 환경 변수 $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
환경 변수 가 아니라 home
C 셸의 내부 변수입니다(셸이 시작될 때 해당 값으로 초기화되지만 그렇지 않으면 자체적으로 독립 변수임).
답변3
시스템은 로그인 시 HOME 변수를 사용자 홈 디렉토리의 경로 이름으로 설정합니다. 그것은 출신이다
- 그래픽 세션의 경우 gdm, kdm 또는 xdm.
- 로그인 콘솔, 텔넷 및 rlogin 세션
- SSH 연결을 위한 sshd
값을 변경할 수 있지만 .bashrc, .profile, .xinitrc 등과 같은 파일은 홈 디렉터리에 없으면 읽혀지지 않으므로 주의하세요.