【问题标题】:perl printing to stdout instead of printing to fileperl 打印到标准输出而不是打印到文件
【发布时间】:2014-07-22 21:02:39
【问题描述】:

所以我在这个问题上撞墙了,老实说,我认为我错过了一些简单的东西。我还认为我的问题要么是 herdoc 有问题,要么是我使用 STDIN 的方式有问题。

任何人,当我在命令行上运行以下脚本时(是的,以 root 身份运行),而不是打印到文件,它只是打印到 STDOUT,这让我很困惑。

sub do_stuff {
    my $resp = <STDIN>;

    my $service_file = <<END_FILE;
[Unit]
Description = tc hack for perist across reboot
After = syslog.target network.target nss-lookup.target

[Service]
Type = simple
ExecStart = /etc/tc/tcconfig.sh
ExecReload = /bin/kill -HUP \${MAINPID}
ExecStop = /bin/kill -INT \${MAINPID}
TimeoutSec = 30
Restart = on-failure
LimitNOFILE = 32768

[Install]
WantedBy = multi-user.target

END_FILE
    my $service_path = '/etc/systemd/system/multi-user.target.wants/tc.service';

    open(my $sfile, ">", $service_path)
      || die "can't open file for write ($service_path) $!";
    print $service_file;
    close $sfile;

}

这个到命令行的输出是:

[Unit]
Description = tc hack for perist across reboot
After = syslog.target network.target nss-lookup.target

[Service]
Type = simple
ExecStart = /etc/tc/tcconfig.sh
ExecReload = /bin/kill -HUP ${MAINPID}
ExecStop = /bin/kill -INT ${MAINPID}
TimeoutSec = 30
Restart = on-failure
LimitNOFILE = 32768

[Install]
WantedBy = multi-user.target

输出被打印到命令行而不是文件。不知道为什么。非常感谢任何帮助!

干杯

【问题讨论】:

标签: perl file-io stdout heredoc


【解决方案1】:

您需要指定正确的 FH:

print $sfile $service_file;

【讨论】:

  • 啊,很好。长周末让我忽略了它。
【解决方案2】:

您打开一个文件句柄但不打印到它:

open(my $sfile, ">", $service_path)
      || die "can't open file for write ($service_path) $!";
print $service_file;
close $sfile;

应该是:

open(my $sfile, ">", $service_path)
      || die "can't open file for write ($service_path) $!";
print $sfile $service_file;
close $sfile;

【讨论】: