如何在Bash中获取当前用户的用户名?

527

如何在Bash中获取当前用户的用户名?我使用whoami命令吗?

使用whoami命令可以获取当前用户的用户名。

到目前为止,似乎没有任何一种方法可以在不依赖$USER或调用单独进程的情况下工作。难道没有bash内置命令可以获取用户名而不调用单独进程吗? - ColinM
11
如果你听到一个命令但不确定如何使用它,检查“man whoami”通常是查找文档的好第一步。 - Mark Stosberg
14个回答

745

在命令行中输入

whoami
或者
echo "$USER"

79
注意:如果你通过SSH作为另一个用户运行命令,$USER和whoami返回不同的值。whoami返回操作系统用户,$USER返回SSH用户。 - BillMan
8
@BillMan,那是什么意思?你能举个例子吗? - Dejay Clayton
23
在某些情况下,$USER 可能根本没有设置。更糟糕的是,它只是一个环境变量,所以用户可以覆盖它:USER=thisisnotmyname bash -c 'echo $USER' # 输出 thisisnotmyname - sitaktif
6
我明白我让这个问题听起来比通常情况更糟。不过,为了回答你的问题,使用 whoami (正如你所建议的)能够彻底消除这个问题,假设在你的环境中覆盖环境变量是一个潜在的问题。 - sitaktif
3
“current username” 这个词稍微有点歧义。在使用 sudo 的情况下,你想要得到什么?当不使用 sudo 时,“echo $USER” 返回我登录的用户名,而无论是否使用 sudo,“whoami” 都返回“root”,否则它会返回我的真实登录名。需要以 sudo 运行的脚本更可能属于那些需要您的登录名而不是“root”的脚本中的少数。 - Ron Burk
显示剩余4条评论

130

一个替代 whoami 的命令是 id -u -n

id -u 命令将返回用户的ID(例如,root 用户的ID 为 0)。


10
如果需要考虑可移植性,那么这应该是正确的方法,因为id命令和-u-n标志是POSIX的一部分。 - user777337
6
这确实应该成为被接受的答案。${USER}whoami都依赖于您如何登录。特别是,登录shell和sudo将设置$USER,而whoami查看附加到标准输入流的用户。但是,如果您从cron运行批处理作业,或者以不同于root的用户身份运行启动脚本,则它们将输出错误的用户(root)或根本不输出任何内容。通过查看进程的用户ID,这个答案将返回正确的值。 - Asfand Qazi
3
如果在发表不实评论之前尝试了该命令,您会发现-n参数会像原始问题所要求的那样打印用户名。请参见以下内容:id -u -n输出brett - 即使在Darwin上也是如此。 - Brett
当需要检查运行的容器实例时,由于很少安装命令行应用程序,可以选择这个好方法。许多精简映像中都没有安装 whoami 命令。 - Joshua Schlichting

45

使用标准的Unix/Linux/BSD/MacOS命令logname来检索已登录用户。这会忽略环境变量和sudo,因为它们的报告不可靠。该命令始于大约1981年,它将始终打印已登录用户的名称,然后退出。

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

4
相较于使用 whoami 或 $USER,这对我非常有帮助,因为我正在使用 sudo 以另一个用户的身份执行命令,但想要原始用户而不是 sudo 用户。 - mynameispaulie
2
顺便说一句,这是最好的答案,不仅对我个人而言,也符合OP问题的目的。 - dani 'SO learn value newbies'
1
不幸的是,在WSL中它无法工作 https://github.com/microsoft/WSL/issues/888 - ahmadali shafiee

21

我在Solaris 9和Linux上使用的技巧,对两者都有效:

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

这段代码打印出当前EUID用户的名称。

注意: 这里需要使用Bash解释器。

在Solaris上,你可能会遇到上述描述的问题:

  • id不接受-u-n参数(因此您将不得不解析输出)
  • whoami不存在(默认情况下)
  • who am I打印当前终端的所有者(忽略EUID)
  • $USER变量仅在读取配置文件后正确设置(例如,/etc/profile

1
为什么需要bash作为解释器?命令行中显示的内容似乎与任何shell都无关。实际上,为什么要包括通过awk的管道呢?据我所知,您的“ps”命令就足以显示当前shell pid的所有者。 - ghoti
作为人类,忽略多余信息是很自然的。awk 部分隔离所需数据--对于变量或者一般情况下还不能在这个基础水平上即时做出假设的计算机来说。 - BradChesney79
在Solaris上,使用command -p id(从POSIX shell)或/usr/xpg4/bin/id。更一般地,在Solaris上,您需要修改环境以将自己置于POSIX环境中(例如使用PATH=getconf PATH之类的东西,并确保运行/usr/xpg4/bin/sh`),以避免被困在70年代/80年代的命令中。 - Stephane Chazelas
ps:未知选项 -- o - Anand Rockzz

12

两个命令:

  1. id 打印出用户id以及所属的组。 格式:uid=用户号(用户名) ...

  2. whoami 给出当前用户名称。


1
在bash中,$whoami不可用作变量。你需要使用$(whoami)或`whoami`来实际执行whoami命令! - Rudolf Mayer
@RudolfMayer 我已经修复了。 - wjandrea

10

当需要root(sudo)权限时,通常情况下使用脚本时有90%以上的机会需要,之前回答中的方法总是给出root作为答案。

获取当前“已登录”用户同样简单,但需要访问不同的变量:$SUDO_UID$SUDO_USER

它们可以被输出:

echo $SUDO_UID
echo $SUDO_USER

或者,例如被指定为:

myuid=$SUDO_UID
myuname=$SUDO_USER

7
在Solaris操作系统中,我使用了以下命令:

Solaris OS。

$ who am i     # Remember to use it with space.

在Linux上 - 有人已经在评论中回答了这个问题。
$ whoami       # Without space

这两个命令显示了两种不同的信息。只需以root身份登录,使用“su - xxx”,然后亲自查看即可。 - FCA69

7
REALUSER="${SUDO_USER:-${USER}}"

...让你获得普通用户(如果非sudo) → 或 ← 在当前sudo调用背后的普通用户。


2
内部花括号对不是必需的 -> ${SUDO_USER:-$USER}。或者使用 whoami ${SUDO_USER:-$(whoami)} - Alex_M
我该如何在嵌套引号中实现它?例如:my_var="$('/some/path/to/${USER}/more/path' 'and/something/else')". - SumNeuron

5

可以使用纯Bash的${parameter@operator}参数扩展(在Bash 4.4中引入)来获取当前用户的用户名:

$ : \\u
$ printf '%s\n' "${_@P}"

:内置命令(与true同义)可通过设置最后一个参数并将其存储在$_中来代替临时变量。然后,我们使用P运算符将其(\u)展开为提示字符串。

这比使用$USER更好,因为$USER只是一个常规环境变量;它可以被修改、取消设置等。即使没有故意篡改,一个常见的情况也可能出现错误,那就是用户在未启动登录shell(su的默认设置)的情况下进行了切换。


4
针对 Bash、KornShell(ksh)、sh 等,许多问题可以通过以下方式快速得到答案:BashKornShellksh)、sh 等。
man [function]

获取你正在使用的系统的文档或通常更方便的方法是,使用谷歌搜索“man function”。
对于某些在Linux和Unix上有轻微差异的事物,结果可能会有所不同。
对于这个问题,只需在你的shell中输入“whoami”。
要进行脚本编写:
myvar=$(whoami)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接