2009-09-04 3 views
25

У меня есть сценарий, который должен знать, с какого имени пользователя он запускается.Как я могу получить имя пользователя, выполняющего мой скрипт Perl?

Когда я запускаю его из оболочки, я могу легко использовать $ ENV {"USER"}, который предоставляется bash.

Но, по-видимому, тогда же сценарий запускается из cron, также через bash - $ ENV {"USER"} не определен.

Конечно, я могу:

my $username = getpwuid($<); 

Но это не выглядит хорошо - есть ли лучше/красивее путь? Он не должен быть независимым от системы, поскольку сценарий предназначен для моего личного использования и будет работать только в Linux.

ответ

9

комплекты crontab $LOGNAME, поэтому вы можете использовать $ENV{"LOGNAME"}. $LOGNAME также установлен в моей среде по умолчанию (не смотрел, где он установлен), поэтому вы можете использовать только $LOGNAME вместо $USER.

Хотя я согласен с хакером, не знаю, что не так в getpwuid.

2

Извините, почему это не так "хорошо выглядит"? Это подходящий системный вызов для использования. Если вы хотите, чтобы внешняя программа вызывала (например, что-то, что вы могли бы использовать из сценария bash), есть инструменты/usr/bin/id и/usr/bin/whoami для использования.

8

Это выглядит красивее?

use English qw(−no_match_vars); 

my $username = getpwuid $UID; 
+2

Хе. В моем фактическом коде я (конечно) пользуюсь английским языком, и я действительно использую $ REAL_USER_ID, но я не хотел приводить здесь какие-либо дебаты по «английскому или короткому именам» :) – 2009-09-04 14:52:59

+0

В моем коде я использовал бы ' $ <', так что это не дискуссия, о которой я беспокоюсь, но я думал, что вы можете считать ее красивее. –

45

Попробуйте получить ответ из нескольких мест, первый один выигрывает:

my $username = $ENV{LOGNAME} || $ENV{USER} || getpwuid($<); 
Смежные вопросы