我该如何获取执行我的Perl脚本的用户名称?

32

我有一个脚本,需要知道它运行的用户名。

当我从shell中运行时,我可以轻松使用$ENV{"USER"},这是由bash提供的。

但显然 - 当相同的脚本通过cron运行时,也是通过bash - $ENV{"USER"}未定义。

当然,我可以:

my $username = getpwuid( $< );

但是它看起来不太好看 - 有更好/更漂亮的方法吗?它并不需要是系统独立的,因为这个脚本是我自己使用的,而且只会在Linux上运行。

5个回答

58

尝试从多个地方获取答案,第一个获得的为胜者:

my $username = $ENV{LOGNAME} || $ENV{USER} || getpwuid($<);

11

crontab设置$LOGNAME,所以您可以使用$ENV{"LOGNAME"}。默认情况下也会在我的环境中设置$LOGNAME(尚未查看其设置位置),因此您可能只需使用$LOGNAME而不是$USER

尽管我同意hacker的看法,但不知道getpwuid有什么问题。


10

这看起来更漂亮吗?

use English qw( −no_match_vars );

my $username = getpwuid $UID;

2
呵呵,在我的实际代码中,我(当然)使用英语,并且我实际上使用$REAL_USER_ID,但我不想在这里引发任何“英语 vs. 短名称”的争论 :) - user80168
在我的代码中,我会使用$<,所以这不是我关心的争论,但我认为你可能会觉得它更漂亮。 - Chas. Owens

2

抱歉,为什么那样的代码“看起来不好”?那是使用的适当系统调用。如果您想要调用外部程序(例如,您可以从bash脚本中使用的东西),则可以使用工具/usr/bin/id和/usr/bin/whoami。


1
显然,Perl在最近几年发生了很多变化,因为这里提供的一些答案在现代Perl中不适用于获取“当前用户名”的干净版本。
例如,getpwuid($<)会打印大量的内容(在列表上下文中作为列表或在标量上下文中粘在一起),而不仅仅是用户名,因此,如果您想要干净的用户名版本,则必须使用(getpwuid($<))[0]。
此外,我很惊讶没有人提到getlogin(),尽管它并不总是有效。为了获得最好的获取用户名的机会,我建议:
my $username = getlogin() || (getpwuid($<))[0] || $ENV{LOGNAME} || $ENV{USER};

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