殻は家をどのように知っていますか?

殻は家をどのように知っていますか?

すべてのシェルには環境変数$ HOMEセットがあります(例/Users/lotolo:)。私がcshの下にいたらできたしunsetenv HOME、そうだったらcd家にいたはずです。私はこれをbash()でもテストしましたが、unset HOME動作は同じです。それでは、シェルはmy/other_userの家がどこにあるかどうかをどうやって知ることができますか?この値はどこで読み取られますか?

私の質問は実行方法ではないので、これは重複しません。わかりましたが、どうですか?シェル知っているHOME。この動作は他のユーザーにも適用されます。

ベストアンサー1

cshとの場合、tcshシェルの起動時に変数の値を記録します($HOME$home@JdeBPが指摘した変数から)。

始める前に設定をキャンセルすると、csh次の内容が表示されます。

$ (unset HOME; csh -c cd)
cd: No home directory.

(そして他のほとんどのBourneのようなシェルの場合bash)私はあなたと異なる動作を見ます。

bash-4.4$ unset HOME; cd
bash: cd: HOME not set

変数の内容は、$HOMEユーザのユーザデータベースに格納された情報に基づいてログインプロセスによって初期化される。名前

ユーザー名自体に関する情報が常に提供されるわけではありません。シェルが決定できるのは、それを実行するプロセスのユーザーIDであり、複数のユーザー(異なるホームディレクトリを持つ)は同じユーザーIDを共有できます。

したがって、一度$HOME消えたら、元に戻すことができる確実な方法はありません。

シェルを実行しているユーザーと同じuidを持つ最初のユーザーのホームディレクトリを見つけるためにユーザーデータベース(getpwxxx()標準APIを使用)を照会するのは単なる近似です(ユーザーデータベースが変更された可能性があることは言うまでもありません(またはホームディレクトリはワンタイム値として定義されています(ログインセッションが開始された後)。

zsh私が知っている唯一のシェルはこれを行うことができます。

$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697)      = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++

私が試した他のすべてのシェルは、HOMEが設定されていないと文句を言うか、それをデフォルトの/home値として使用します。

ただし、他の動作はfishデータベースに問い合わせて$USER保存されたユーザー名を取得するgetpwuid()か、そうでない場合に実行するようです。

$ 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(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 ''

おすすめ記事