Jawaban:
Jika Anda mencoba mengubah HOME Anda, Anda dapat melakukannya
export HOME=/home/...
baik di shell Anda, atau di file ~ / .profile Anda dan / atau ~ / .bashrc (atau shell login yang sesuai).
(Kode di atas akan bekerja untuk bash dan shell yang serupa, yang merupakan default di Debian; Anda akan melakukan `setenv HOME $ HOME: / extra / path Saya pikir pada shell mirip csh di distro lain.)
sunting - Namun ini mungkin bukan cara untuk melakukannya. Lihat jawaban lain. Jangan gunakan jawaban ini.
Di Linux, HOME
variabel lingkungan diatur oleh program login:
login
pada sesi konsol, telnet dan rloginsshd
untuk koneksi SSHgdm
, kdm
atau xdm
untuk sesi grafis.Program login mengaturnya sebelum memanggil exec pada shell Anda (dengan memasukkannya ke dalam argumen untuk exec), berdasarkan nilai pada / etc / passwd.
Menyunting ini dengan menjalankan: usermod -d /home/whatever_dir whatever_user
.
Harap dicatat bahwa ini akan (jelas) menjadi direktori home baru. Bash akan cd
melakukannya saat login, jadi pastikan itu ada dan izin sudah benar. Selain itu, jangan lupa tentang .bashrc
, .profile
, .xinitrc
, dll; jika mereka tidak ada di direktori home, mereka tidak akan dibaca.
Dari usermod
:
Usage: usermod [options] LOGIN
Options:
-c, --comment COMMENT new value of the GECOS field
-d, --home HOME_DIR new home directory for the user account
-e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-f, --inactive INACTIVE set password inactive after expiration
to INACTIVE
-g, --gid GROUP force use GROUP as new primary group
-G, --groups GROUPS new list of supplementary GROUPS
-a, --append append the user to the supplemental GROUPS
mentioned by the -G option without removing
him/her from other groups
-h, --help display this help message and exit
-l, --login NEW_LOGIN new value of the login name
-L, --lock lock the user account
-m, --move-home move contents of the home directory to the
new location (use only with -d)
-o, --non-unique allow using duplicate (non-unique) UID
-p, --password PASSWORD use encrypted password for the new password
-R, --root CHROOT_DIR directory to chroot into
-s, --shell SHELL new login shell for the user account
-u, --uid UID new UID for the user account
-U, --unlock unlock the user account
Saya melakukan beberapa penggalian, dan jawabannya cukup mengejutkan. Ambil skrip tes berikut dan chmod +x
:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Kita dapat menjalankannya dengan ./test.sh
dan melihat:
Rumah saya adalah: / home / pengguna
Mari kita mengintip di bawah tenda dengan strace.
$ strace ./test.sh |& grep '^open[a-z]*'
openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat (3) AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEC | = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/ usr / lib / locale / arsip-lokal", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ usr /" / usr / "/ usr /) lib / x86_64-linux-gnu / gconv / gconv-modules.cache ", O_RDONLY) = 3
openat (AT_FDCWD," ./test.sh ", O_RDONLY) = 3
Saya tidak melihat penyebutan HOME, file rc, atau passwd. Mari kita coba dengan env bersih:
env -i bash
echo $HOME #this will be blank since we cleared the env
Tidak ada, seperti yang diharapkan. Mari kita jalankan skrip di env kosong.
env -i bash
./test.sh
Rumah saya adalah: / home / pengguna
Menarik, skripnya bisa pulang. Sekarang mari kita telusuri.
strace ./test.sh |& grep '^open[a-z]*'
Sekarang kita melihat:
openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat (3) AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEC | = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/etc/ld.so). cache ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD," /lib/x86_64-linux-gnu/libnss_compat.so.2 ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD," /etc/ld.co. cache) , O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_nis.so.2 ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnsl.so.1", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY O_CLOEXEC) = 3
openat (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "./test.sh", O_RDONLY) = 3
Saya sudah berani garis yang menarik. Seperti yang dapat kita lihat, akan terlihat bahwa ketika $HOME
tidak ditentukan, shell akan mencoba mengisinya, bahkan ketika tidak dalam mode login atau interaktif.
$HOME
dengan$PATH
. Tidak masuk akal untuk memiliki beberapa jalur$HOME
(seluruh nilai akan diperlakukan sebagai satu pathname) atau, dalam banyak kasus, untuk memodifikasi$HOME
sama sekali.