쉘은 집을 어떻게 알 수 있습니까?


25

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

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


1
@StephenKitt, 중복은 없습니다. 여기에서는 현재 사용자의 홈 디렉토리에 대한 쉘 동작에 대해 설명합니다.
Stéphane Chazelas

간단한 경우에서 /etc/passwd. 일부 시스템은 해당 정보를 LDAP, NIS 서버 등에 저장할 수 있습니다.
Satō Katsura

1
프로그램 (쉘 포함)은 전화를 걸 getpwuid(3)거나 유사하게합니다. 일부 시스템은 LDAP, NIS, NIS + 등에서 getpwuid(3)정보를 검색 하기 위해 "재배 선"되도록 구성 할 수 있습니다 /etc/passwd.
Satō Katsura

@StephenKitt, 내 답변보기
Stéphane Chazelas

1
@ GAD3R, 위의 토론을 참조하십시오. StephenKitt는 이미 동일한 복제본 (그가 철회 한 이후)을 지적했지만 복제본이 아니라고 위에서 주장합니다 (또한 내 대답 참조).
Stéphane Chazelas

답변:


33

의 경우 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 ''

2
이 문제를보고 할 수 있다고 생각합니다! 정말 좋은 답변 btw, 감사합니다!
LotoLo

1
@ LotoLo, 예, fish버그가 있는지 확인하기 위해 dev git head로 빌드 중입니다 . 편집하다. 네 그렇습니다.
Stéphane Chazelas

궁금합니다 : 설정되지 않은 경우 어떤 환경 변수가 쉘을 최대한 사용자 친화적으로 만들지 않습니까? PATH? TERM? USER?
user1024

여기에는 이상한 줄이 있습니다. "근사값 일뿐입니다." 무엇이 되었습니까?
muru

1
@muru Querying the user database... would only be...정말 명확하지 않다
edc65

6

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

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

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

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


csh에는 아니오 (적어도 내 버전 : "tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-apple-darwin)")는 가정의 가치를 전달하는 HOME 변수입니다. 그러나 @Stephane Chazelas가 말했듯이 쉘을 시작하기 전에 변수를 설정 해제해야 시작시 HOME 값이 설정됩니다.
LotoLo

위는 내가 편리한 오픈 BSD 시스템에서 실행 한 C 쉘, 그 동작을 보여줍니다. 심지어 TENEX C 쉘조차도 아닙니다 (똑같이 동작하지만).
JdeBP

그렇습니다 나는 그것을 보았습니다 ... 나는 타이핑 csh했지만 분명히 그것은 별칭입니다tcsh
LotoLo

0

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

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

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


하지만 설정을 해제 할 수 있습니다 ($ HOME) ... 그렇습니까? 그리고 다른 사용자의 집이 어디에 있는지 어떻게 알 수 있습니까?
LotoLo

1
usermod -d HOME_DIR새 usre가 작성되면 명령을 사용하여 업데이트 할 수 있습니다 . 기본 홈은 / home / $ username이며 로그인 프로그램에 의해 결정됩니다.
Dababi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.