また、この変数は常に現在ログインしているユーザー名(私の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
またはzsh
setと同じです$LOGNAME
。zsh
設定$USERNAME
(許可されている場合は変数に値を割り当てることで、uids / gidをユーザーの値に変更することもできます)。
グラフィカルログインマネージャ(ターミナルにログインすると呼び出され、時にはグラフィカルログインマネージャなどの他のエントリlogin
によって呼び出される)など、ログインするエントリによって設定される場合とそうでない場合があります。getty
in.rlogind
cron
su
sudo
sshd
rshd
ログインがある場合は$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}
それでも空であれば、かなり難しいシステムにあります。 ;)