Setiap shell memiliki variabel lingkungan yang diset $ HOME (mis /Users/lotolo
. :) . Jika saya di bawah csh saya bisa unsetenv HOME
dan masih jika saya melakukannya cd
saya akan berada di rumah saya. Saya sudah menguji ini juga di bash ( unset HOME
) dan itu perilaku yang sama. Jadi bagaimana shell tahu di mana rumah / user_user saya berada? Di mana ia membaca nilai-nilai itu?
Ini bukan duplikat karena pertanyaan saya bukan bagaimana saya tahu, tetapi bagaimana shell tahu HOME
. Dan perilaku ini juga diperluas ke pengguna lain.
/etc/passwd
. Beberapa sistem dapat menyimpan informasi itu dalam LDAP, server NIS, dll.getpwuid(3)
atau serupa. Beberapa sistem dapat dikonfigurasikan untuk "rute-ulang"getpwuid(3)
untuk mengambil informasi dari/etc/passwd
, LDAP, NIS, NIS + dll.Jawaban:
Dalam kasus
csh
dantcsh
, 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:Untuk
bash
(dan kebanyakan kerang mirip Bourne), saya melihat perilaku yang berbeda dari milik Anda.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: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 melakukangetpwuid()
jika tidak:SEGV ketika pengguna tidak ada ( https://github.com/fish-shell/fish-shell/issues/3599 ):
sumber
fish
kepala dev git untuk melihat apakah ada bug di sana. Edit. Ya itu.PATH
?TERM
?USER
?Querying the user database
...would only be...
memang tidak begitu jelasTidak. Anda tidak melakukan eksperimen dengan benar. Seperti yang dapat Anda lihat dari manual shell C,
cd
perintah berubah ke nilaihome
variabel jika disediakan tanpa argumen. Jika variabel ini tidak disetel, itu tidak tahu ke mana harus mengubah direktori dan mencetak kesalahan:Anda membatalkan variabel yang salah. Itu bukan
HOME
, variabel lingkungan, itu adalahhome
variabel internal shell C (diinisialisasi dari nilai yang pertama ketika shell dijalankan, tetapi sebaliknya variabel independen dalam haknya sendiri).sumber
csh
tetapi ternyata itu aliastcsh
Sistem mengatur variabel HOME pada saat login menjadi pathname dari direktori home pengguna. Sudah diatur oleh
Anda dapat mengubah nilainya tetapi perhatikan karena .bashrc, .profile, .xinitrc, dll tidak akan dibaca jika tidak ada di direktori home.
sumber
usermod -d HOME_DIR
perintah, saat pengguna baru dibuat. home default adalah / home / $ username dan ditentukan oleh program login.