Dalam kasus csh
dan tcsh
, ia mencatat nilai $HOME
variabel pada saat shell dimulai ( dalam $home
variabelnya seperti dicatat oleh @JdeBP ).
Jika Anda menghapusnya sebelum memulai csh
, Anda akan melihat sesuatu seperti:
$ (unset HOME; csh -c cd)
cd: No home directory.
Untuk bash
(dan kebanyakan kerang mirip Bourne), saya melihat perilaku yang berbeda dari milik Anda.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
Konten $HOME
variabel diinisialisasi oleh proses login berdasarkan informasi yang disimpan dalam database pengguna terhadap nama pengguna Anda .
Informasi tentang nama pengguna itu sendiri tidak selalu tersedia. Semua shell dapat mengetahui dengan pasti adalah userid dari proses yang mengeksekusinya dan beberapa pengguna (dengan direktori home berbeda) dapat berbagi userid yang sama.
Jadi, sekali $HOME
hilang tidak ada cara yang dapat diandalkan untuk mendapatkannya kembali.
Meminta basis data pengguna (dengan getpwxxx()
API standar) untuk direktori home pengguna pertama yang memiliki cairan yang sama dengan yang menjalankan shell hanya akan menjadi perkiraan (belum lagi fakta bahwa basis data pengguna bisa saja berubah (atau rumah direktori didefinisikan sebagai nilai satu kali) sejak sesi login dimulai).
zsh
adalah satu-satunya shell yang saya tahu yang melakukan itu:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Semua kerang lain yang saya coba mengeluhkan tentang HOME yang belum disetel atau digunakan /
sebagai nilai rumah default.
Namun perilaku yang berbeda adalah fish
, yang tampaknya menanyakan database untuk nama pengguna yang disimpan $USER
jika ada atau melakukan getpwuid()
jika tidak:
$ 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 ketika pengguna tidak ada ( 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 ''