Cada shell tiene una variable de entorno $ HOME set (ej /Users/lotolo
.:). Si estoy bajo csh puedo unsetenv HOME
y aún si lo hago cd
, estaré en mi casa. He probado esto también en bash ( unset HOME
) y es el mismo comportamiento. Entonces, ¿cómo sabe el shell dónde está mi / other_user home? ¿Dónde lee esos valores?
Esto no es un duplicado desde que mi pregunta no es ¿cómo lo sé, pero ¿cómo lo hace la cáscara conocimientos HOME
. Y este comportamiento también se extiende a otros usuarios.
/etc/passwd
. Algunos sistemas pueden almacenar esa información en LDAP, servidores NIS, etc.getpwuid(3)
o son similares Algunos sistemas se pueden configurar para "redirigir"getpwuid(3)
para recuperar información de/etc/passwd
, LDAP, NIS, NIS + etc.Respuestas:
En el caso de
csh
ytcsh
, registra el valor de la$HOME
variable en el momento en que se inició el shell ( en su$home
variable como lo señaló @JdeBP ).Si lo desarma antes de comenzar
csh
, verá algo como:Para
bash
(y la mayoría de los otros shells tipo Bourne), veo un comportamiento diferente al tuyo.El contenido de la
$HOME
variable se inicializa mediante el proceso de inicio de sesión en función de la información almacenada en la base de datos de usuario con su nombre de usuario .La información sobre el nombre de usuario en sí no siempre está disponible. Todo lo que un shell puede saber con certeza es el ID de usuario del proceso que lo está ejecutando y varios usuarios (con diferentes directorios de inicio) pueden compartir el mismo ID de usuario.
Entonces, una vez que
$HOME
se va, no hay una forma confiable de recuperarlo.Consultar la base de datos de usuario (con
getpwxxx()
API estándar) para el directorio de inicio del primer usuario que tiene el mismo uid que el que ejecuta el shell solo sería una aproximación (sin mencionar el hecho de que la base de datos de usuario podría haber cambiado (o el inicio el directorio se define como un valor único) desde que comenzó la sesión de inicio de sesión).zsh
es el único shell que sé que hace eso:Todos los otros proyectiles que probé se quejan de que HOME no está configurado o lo usan
/
como valor de inicio predeterminado.Sin embargo, un comportamiento diferente es
fish
el que parece consultar en la base de datos el nombre de usuario almacenado en$USER
caso de existir o hacer ungetpwuid()
caso en caso contrario:SEGV cuando el usuario no existe ( https://github.com/fish-shell/fish-shell/issues/3599 ):
fuente
fish
la cabeza del desarrollador para ver si el error también está allí. Editar. Sí lo es.PATH
?TERM
?USER
?Querying the user database
...would only be...
no está tan claro de hechoNo lo hace. Simplemente no estás realizando el experimento correctamente. Como puede ver en el manual del shell C, el
cd
comando cambia al valor de lahome
variable si no se proporciona ningún argumento. Si esta variable no está configurada, no sabe a dónde cambiar el directorio e imprime un error:Desarmaste la variable incorrecta. No es
HOME
, la variable de entorno, eshome
la variable interna de la shell C (inicializada a partir del valor de la primera cuando se inicia la shell, sino una variable independiente por derecho propio).fuente
csh
pero aparentemente tiene un aliastcsh
El sistema establece la variable INICIO al momento de iniciar sesión para que sea una ruta de acceso del directorio de inicio del usuario. Es establecido por
Puede cambiar su valor pero preste atención porque .bashrc, .profile, .xinitrc, etc. no se leerán si no están en el directorio de inicio.
fuente
usermod -d HOME_DIR
comando, cuando se crea un nuevo usre. el inicio predeterminado es / home / $ username y lo determina el programa de inicio de sesión.