2009-09-04 12 views
25

Ich habe ein Skript, das wissen muss, von welchem ​​Benutzernamen es ausgeführt wird.Wie kann ich den Namen des Benutzers erhalten, der mein Perl-Skript ausführt?

Wenn ich es aus der Shell ausführen, kann ich einfach $ ENV {"USER"} verwenden, die von bash zur Verfügung gestellt wird.

Aber anscheinend - dann wird das gleiche Skript von Cron ausgeführt, auch über bash - $ ENV {"USER"} ist nicht definiert.

Natürlich, ich kann:

my $username = getpwuid($<); 

Aber es ist nicht schön aussieht - ist es eine bessere/schönere Art und Weise? Es muss nicht systemunabhängig sein, da das Skript für mich persönlich bestimmt ist und nur unter Linux ausgeführt werden kann.

Antwort

9

Crontab setzt $LOGNAME so können Sie $ENV{"LOGNAME"} verwenden. $LOGNAME ist auch standardmäßig in meiner Umgebung festgelegt (habe nicht untersucht, wo es gesetzt wird), so dass Sie möglicherweise nur $LOGNAME anstelle von $USER verwenden können.

Obwohl ich mit Hacker einverstanden bin, weiß nicht, was an getpwuid falsch ist.

2

Sorry, warum sieht das nicht "gut aus"? Das ist der richtige Systemaufruf, den Sie verwenden können. Wenn Sie ein externes Programm aufrufen möchten (z. B. etwas, das Sie auch aus einem Bash-Skript verwenden könnten), gibt es die Tools/usr/bin/id und/usr/bin/whoami zur Verwendung.

8

Sieht das hübscher aus?

use English qw(−no_match_vars); 

my $username = getpwuid $UID; 
+2

Heh. In meinem eigentlichen Code benutze ich (natürlich) Englisch, und ich benutze tatsächlich $ REAL_USER_ID, aber ich wollte hier keine "English vs. Short-Names" -Debatte auslösen :) –

+0

In meinem Code würde ich '' verwenden $ <', das ist also keine Debatte, die mir wichtig ist, aber ich dachte, du könntest sie schöner finden. –

45

Versuchen Sie Ihre Antwort aus mehreren Stellen bekommen, erste Siege:

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