Trong trường hợp csh
và tcsh
, nó ghi lại giá trị của $HOME
biến tại thời điểm shell được khởi động ( trong $home
biến của nó như được ghi chú bởi @JdeBP ).
Nếu bạn bỏ đặt nó trước khi bắt đầu csh
, bạn sẽ thấy một cái gì đó như:
$ (unset HOME; csh -c cd)
cd: No home directory.
Đối với bash
(và hầu hết các vỏ giống như Bourne khác), tôi thấy một hành vi khác với vỏ của bạn.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
Nội dung của $HOME
biến được khởi tạo bởi quá trình đăng nhập dựa trên thông tin được lưu trữ trong cơ sở dữ liệu người dùng so với tên người dùng của bạn .
Thông tin về tên người dùng không phải lúc nào cũng có sẵn. Tất cả các shell có thể biết chắc chắn là userid của quá trình đang thực thi nó và một số người dùng (với các thư mục nhà khác nhau) có thể chia sẻ cùng một userid.
Vì vậy, một khi $HOME
đã biến mất, không có cách nào đáng tin cậy để lấy lại.
Truy vấn cơ sở dữ liệu người dùng (với getpwxxx()
API tiêu chuẩn) cho thư mục chính của người dùng đầu tiên có cùng uid với người chạy shell sẽ chỉ là một xấp xỉ (không đề cập đến thực tế là cơ sở dữ liệu người dùng có thể đã thay đổi (hoặc nhà thư mục được xác định là giá trị một lần) kể từ khi phiên đăng nhập bắt đầu).
zsh
là cái vỏ duy nhất mà tôi biết làm điều đó:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Tất cả các shell khác tôi đã thử hoặc phàn nàn về việc hủy đặt HOME đó hoặc sử dụng /
làm giá trị nhà mặc định.
Tuy nhiên, một hành vi khác là fish
, dường như truy vấn cơ sở dữ liệu về tên người dùng được lưu trữ $USER
nếu có hoặc thực hiện getpwuid()
nếu không:
$ 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 khi người dùng không tồn tại ( https://github.com/fish-shell/fish-shell/issues35399 ):
$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault env -u HOME USER=foo fish -c ''