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, HOMEvariabel lingkungan diatur oleh program login:
loginpada sesi konsol, telnet dan rloginsshduntuk koneksi SSHgdm, kdmatau xdmuntuk 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 cdmelakukannya 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.shdan 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 $HOMEtidak ditentukan, shell akan mencoba mengisinya, bahkan ketika tidak dalam mode login atau interaktif.
$HOMEdengan$PATH. Tidak masuk akal untuk memiliki beberapa jalur$HOME(seluruh nilai akan diperlakukan sebagai satu pathname) atau, dalam banyak kasus, untuk memodifikasi$HOMEsama sekali.