繁体   English   中英

将输出发送到日志文件或STDOUT

[英]Sending output to logfile or STDOUT

我正在尝试提出一些逻辑,以使我的脚本可以选择将输出发送到哪里。

这是我开始编写的测试脚本,我开始尝试解决这两个选项的组合问题。 我知道我对此考虑过多。

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $output = 0;

my $logfile = '';

GetOptions(

    'o' => \$output,
    'l' => \$logfile

);

if (($output == 1) && (! $logfile eq '')){



} elsif (($output == 0)($logfile eq '')){



}

如果这有什么用,请成为我的客人。

我几乎想要3个选择

0 =关闭1 =标准输出2 =日志文件

如果我想添加自定义日志文件参数,那会给我带来一些麻烦。 我的印象是我无法将2个arg合并为同一个arg,可以吗?

在那里我将有输出,写入的地方,我会用简单的控制if根据条件statments,在我的第一个互为作用刚刚允许输出到标准输出。 我只使用了-o选项并指定了01 如果为1,则写入行;如果为0,则不行。

如果有比上述解决方案更简单的解决方案,那么我愿意接受任何解决方案。

提前致谢。

我将使用$verbose作为选项,以及一个可选的$logfile 因此,如果设置了$verbose ,则进行打印;如果设置了$logfile ,则将打印至日志。

然后使用:

if ($logfile) {
    open STDOUT, '>', $logfile or die $!;
}
print "Yada\n" if $verbose;

或为简单起见:

sub myprint {
    return unless $verbose;
    print @_;
}
myprint("Yada\n");

在TLP的静脉我建议$verbose$logfile选项,我也建议$verbose隐式地设置为true,如果$logfile被使用。 照常使用$verbose控制print命令。 如果没有提供文件句柄,最大的魔术就是使用select来控制print输出的输出位置。

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $verbose = 0;
my $logfile;

GetOptions(

    'verbose' => \$verbose,
    'logfile=s' => \$logfile,

);

if (defined $logfile) {
  $verbose = 1;
  open my $log_handle, '>', $logfile or die "Could not open $logfile";
  # select makes print point to LOGFILE 
  select($log_handle);
}

# do stuff

print "Stuff" if $verbose;

同样,由于Getopt::Long为您提供了长选项,因此我将选项名称更改为可读的verboselogfile ,但是您可以根据需要使用short -v或long --verbose

好的,首先,如果此语法错误,请原谅我。 自完成任何Perl以来,这已经是很长的时间了,因此,将其更多地看作是“做这种事情”,而不是“复制并粘贴我的答案”。 话虽如此,我可能只会这样做:

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $output = 0;
my $logfile = '';

GetOptions(

    'o' => \$output,
    'l' => \$logfile

);

if (($output == 1) && (! $logfile eq '')){
    open STDOUT, $logfile
} elsif (($output == 0)($logfile eq '')){
    open STDOUT, "/dev/null"
}

... (do stuff normally here)

我要做的就是通过将STDOUT发送到日志文件或将其发送到/dev/null来更改STDOUT的运行方向

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM