의 경우 csh
와 tcsh
, 상기의 값을 기록한다 $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 ''