$USERおよび$USERNAME環境変数は誰が設定しますか?

$USERおよび$USERNAME環境変数は誰が設定しますか?

また、この変数は常に現在ログインしているユーザー名(私のDebianシステム)と一致していますか?他のUnix(類似)システムでも使用できると仮定できますか?

whoamiまた、なぜ人々がこれらの変数を読むのではなく使用するのか疑問に思います。

答え1

それログイン

Linuxログイン(1)マニュアルページには次のように記載されています。

の価値$HOME$user$シェル$パス$ログ名$mailパスワード入力の該当するフィールドに従って設定します。

FreeBSDログイン(1)マニュアルページには次のように記載されています。

これログインユーティリティは環境に情報を入力します(参照: 環境(7))ユーザーのホームディレクトリ(HOME)、コマンドソルバー(SHELL)、検索パス(PATH)、端末タイプ(TERM)、およびユーザー名(LOGNAMEとUSER)を指定します。

これネットワークBSDオープンBSDそしてオペレーティングシステムマニュアルページにも同じ内容が記載されています。

これはソースコードutil-linuxでログインします。

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

これはソースコードFreeBSDからログイン:

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

答え2

ルールはありません。一部のシェルはtcshまたはzshsetと同じです$LOGNAMEzsh設定$USERNAME(許可されている場合は変数に値を割り当てることで、uids / gidをユーザーの値に変更することもできます)。

グラフィカルログインマネージャ(ターミナルにログインすると呼び出され、時にはグラフィカルログインマネージャなどの他のエントリloginによって呼び出される)など、ログインするエントリによって設定される場合とそうでない場合があります。gettyin.rlogindcronsusudosshdrshd

ログインがある場合は$USER通常設定されます(ただし、そのログインセッション内でユーザーIDを変更した後は更新されません(setuidコマンドを介して))。 POSIXでは、$LOGNAMEログイン時に設定する必要がありますcron

移植可能なログインを取得するには、このコマンドを使用することをお勧めしますlogname(ログインがなければ何も返さないかもしれません)。ユーザーIDを取得するには、以下を使用してくださいid -u。現在有効なユーザーIDに対応するユーザー名を取得してくださいid -un

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

ただし、これはユーザーデータベースを列挙できないシステム(ネットワークユーザーデータベースで発生した場合など)では機能しない可能性があります。

答え3

あなたは頼りたいかもしれませんPOSIXある時点では、ユーザーログイン(プログラムによって管理されているlogin)だけでなく、タスクcronなどにも興味があるため、これは標準です。

$LOGNAMEしたがって、POSIXでは必要があるが必要ではないことに注意する必要があります$USER。たとえば、$USER次のようにcronによって設定されない可能性があります。キストンプソンの答えまた、これがBSDを使用したSystem-Vの歴史とどのように関連しているかについてのいくつかの歴史を引用しています。

...少なくとも私のシステム(Ubuntu 14.04)では、$ USER環境変数がcronジョブに設定されていません。代わりに、cron作業環境の一部である$ LOGNAMEを使用できます。

~によると環境(7)マニュアルページ(読むにはman Environ入力)、$ USERはBSD派生で使用され、$ LOGNAMEはSystem-V派生で使用されます。

答え4

whoami環境変数(ORgetpwentと代わりに)を使用していて、getpwnamすべての* NIXシステムで常に同じ方法で設定されているかどうかわからない場合は、bashで次のことを試してください。

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

それでも空であれば、かなり難しいシステムにあります。 ;)

関連情報