我有一个脚本需要知道它是从哪个用户名运行的。
当我从 shell 运行它时,我可以轻松使用 bash 提供的
$ENV{"USER"}
。
但显然 - 然后从 cron 运行相同的脚本,也通过 bash -
$ENV{"USER"}
未定义。
当然可以:
my $username = getpwuid( $< );
但是看起来不太好 - 有没有更好/更好的方法?它不必独立于系统,因为该脚本仅供我个人使用,并且仅在 Linux 上运行。
尝试从多个地方获取答案,第一个获胜:
my $username = $ENV{LOGNAME} || $ENV{USER} || getpwuid($<);
crontab 设置
$LOGNAME
,以便您可以使用 $ENV{"LOGNAME"}
。默认情况下,我的环境中也设置了 $LOGNAME
(虽然没有查看它的设置位置),因此您可能只能使用 $LOGNAME
而不是 $USER
。
虽然我同意hacker的观点,但不知道哪里出了问题
getpwuid
。
这个看起来更漂亮吗?
use English qw( −no_match_vars );
my $username = getpwuid $UID;
抱歉,为什么“看起来不太好”? 这是要使用的适当的系统调用。 如果您想要调用外部程序(例如您也可以从 bash 脚本使用的东西),可以使用 /usr/bin/id 和 /usr/bin/whoami 工具。
近年来 Perl 显然发生了很大变化,因为这里给出的一些答案不适用于在现代 Perl 中获取“当前用户名”的干净版本。
例如, getpwuid($not<) prints a whole bunch of stuff (as a list in list context, or pasted-together as a string in scalar context), 只是用户名,所以你必须使用 (getpwuid($ <))[0] instead if you want a clean version of the username.
另外,我很惊讶没有人提到 getlogin(),尽管这并不总是有效。为了获得真正获得用户名的最佳机会,我建议:
my $username = getlogin() || (getpwuid($<))[0] || $ENV{LOGNAME} || $ENV{USER};