bashでユーザ名を取得する

2024/09/05に公開

あらまし

あるシェルスクリプトをDockerコンテナ内で実行すると、シェルスクリプト内で環境変数$USERが設定されておらずエラーとなる事象に遭いました。

結論から書くと、

  • docker run -it rockylinux:9 /bin/bashでコンテナに接続する
  • そのbashはログインシェルではなくインタラクティブシェルなので、/etc/profileは実行しない
  • /etc/profile内で$USER変数が設定されるため、インタラクティブシェルでは$USERが使えない
  • そのため、$USERの代わりにwhoamiを使用した

という感じでした。

ということで、備忘のためにbashでユーザ名を取得する方法をまとめておきます。

echo $USER

環境変数$USERを使ってユーザー名を表示します。ただし、セッションによっては正しく設定されていないこともあるため注意が必要です。また、上書きすることも可能であるためその点にも注意が必要です。

$ echo $USER
shinya
$ sudo echo $USER
shinya

whoami

現在のユーザー名をそのまま表示します。

$ whoami
shinya
$ sudo whoami
root

logname

セッションにログインしたユーザー名を取得します。sudoの影響を受けずにログインユーザーを知りたい場合に便利です。

$ logname
shinya
$ sudo logname
shinya

$USERと同様に/etc/profile内で$LOGNAME変数が設定されますが、$USERと同様の注意点があるのでlognameコマンドを使うのがいいでしょう。

id -u -n

現在のユーザーIDに対応するユーザー名を取得します。

$ id -u -n
shinya
$ sudo id -u -n
root

ps -o user= -p $$ | awk '{print $1}'

Solarisなどの環境で、標準のコマンドが利用できない場合に使える方法です。

$ ps -o user= -p $$ | awk '{print $1}'
shinya

まとめ

ユーザー名を取得する方法は、環境や用途、sudoの影響の有無に応じて適切に選択する必要があるので、皆様お気を付けください。

参考

https://stackoverflow.com/questions/19306771/how-do-i-get-the-current-users-username-in-bash

Discussion