将输出从exec发送到文件perl

时间:2017-09-27 08:45:52

标签: bash perl

问题

在perl中运行exec时,我无法将输出重定向到文件。

我在exec中运行vlc但是因为我怀疑每个人都设置了我已经用下面的echo替换它,它显示了相同的行为。

我只对exec'命令'感兴趣,'args'格式的exec不是生成shell的那个,因为它生成一个带有vlc的子shell,它仍会打印到屏幕+其他问题,干净地杀死它。

代码

use strict;
use warnings;

my $pid = fork;
if (!defined $pid) {
    die "Cannot fork: $!";
}
elsif ($pid == 0) {
    exec "/usr/bin/echo","done";
}

试过

exec "/usr/bin/echo","done",">/dev/null";

正如预期的那样只打印“> / dev / null”,但值得一试。

exec "/usr/bin/echo done >/dev/null";

运行sh,然后运行echo,在这里工作,但不是我在vlc的实际问题,我认为我会包括在内,因为有人肯定会建议它。

问题

当对文件使用'command','args'时,如何重定向此exec的输出?

附加

需要更多信息,请询问。

2 个答案:

答案 0 :(得分:3)

原来你可以在exec之前更改文件描述符

use strict;
use warnings;

my $pid = fork;
if (!defined $pid) {
    die "Cannot fork: $!";
}
elsif ($pid == 0) {
    open STDOUT, ">", '/logger/log' or die $!;
    open STDERR, ">", '/logger/log' or die $!;
    exec "/usr/bin/echo","done";
 }

答案 1 :(得分:0)

我想如果你只需要打印到文件,这应该可行。

捕获输出的最简单方法是使用反引号。

use strict;
use warnings;

open (my $file, '>', 'output.log');
my $pid = fork;
if (!defined $pid) {
    die "Cannot fork: $!";
}
elsif ($pid == 0) {
    print $file `/usr/bin/echo done`;
}