Durumunda csh
ve tcsh
bu değerini kaydeder $HOME
(kabuk başlatıldığı zaman değişkeni onun içinde $home
@JdeBP tarafından belirtildiği gibi değişken ).
Başlamadan önce csh
ayırırsanız, şöyle bir şey görürsünüz:
$ (unset HOME; csh -c cd)
cd: No home directory.
İçin bash
(ve Bourne gibi kabuklarına diğer çoğu), ben seninkinden daha farklı bir davranış bakın.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
İçeriği $HOME
değişken kullanıcı karşı kullanıcı veritabanında saklanan bilgilere dayanarak giriş işlemi ile bir sıfırlanır isim .
Kullanıcı adıyla ilgili bilgiler her zaman kullanılamaz. Kesin olarak bir kabuğun tüm bildiği, onu çalıştıran işlemin kullanıcı kimliğidir ve birçok kullanıcı (farklı ev dizinleri ile) aynı kullanıcı kimliğini paylaşabilir.
Yani, bir kez $HOME
gitti, onu geri almak için güvenilir bir yolu yoktur.
getpwxxx()
Kabuğu çalıştıran ile aynı kullanıcı kimliğine sahip olan ilk kullanıcının giriş dizini için kullanıcı veritabanını ( standart API ile) sorgulamak yalnızca bir yaklaşım olacaktır (kullanıcı veritabanının değişmiş olabileceği gerçeğinden bahsetmeden değil) dizini, tek seferlik bir değer olarak tanımlanıyor).
zsh
Bunu bildiğim tek kabuk:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Çalıştığım diğer tüm kabukları, bu dengesiz HOME hakkında şikayet ediyor veya /
varsayılan bir ev değeri olarak kullanıyor.
Yine de farklı bir davranış vardır fish
, ki bu veritabanında depolanan kullanıcı adı için veritabanını sorgulamış gibi görünüyor $USER
ya da getpwuid()
eğer değilse:
$ 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) +++
Kullanıcı olmadığında SEGV ( 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 ''