Cron如何影响Getopt :: Long模块?

时间:2010-07-13 12:50:28

标签: perl unix cron

我已经使用perl为mailx编写了一个包装器程序,它允许我轻松添加附件并执行一些其他漂亮的事情,这些事情对于mailx来说有点令人沮丧。

在我的前几行中:

use strict;
use warnings;
use Getopt::Long;

my ( $to, $from, $subject, $attachments, $body, $file ) = (undef) x 7;

GetOptions(
    "to=s"          => \$to,
    "from=s"        => \$from,
    "subject=s"     => \$subject,
    "attachments=s" => \$attachments,
    "body=s"        => \$body,
    "file=s"        => \$file,
);
$to      = getlogin unless $to;
$from    = getlogin unless $from;
$subject = " "      unless $subject;

到目前为止,这个包装器在被其他脚本调用时工作正常。但是现在我们有一个由Cron运行的脚本,一些有趣的事情正在发生。此Cron作业通过仅指定-t和-su来调用包装器,但省略-fr(正在使用标志的缩写)。生成的电子邮件正确设置为:但是发件人列为-s@blah.com,主题行为空。根据上面的代码,我只能假设Cron和Getopt :: Long模块之间存在一些奇怪的问题。有谁知道为什么Cron的工作可能导致这种奇怪的行为?如果它是其他错误的东西会是什么?

1 个答案:

答案 0 :(得分:5)

Perl的getlogin可能不会从cron返回任何有用的内容,引用getlogin(3)

   getlogin() returns a pointer to a string containing
   the name of the user logged in on the controlling
   terminal of the process, or a null pointer if this
   information cannot be determined.

我建议您更改crontab,以便始终为依赖getlogin的任何选项明确包含用户名。您还可以更改包装器以使用getpwuid($<)。 (有关perlvar(1)perlfunc(1)的详细信息,请参阅$<getpwuid。)

为什么搞砸了你的mailx,我不知道,但我猜你正在使用反引号,execsystem用字符串来启动mailx,而不是{ {1}}或exec列表。