【问题标题】:Send output from exec to file perl将输出从 exec 发送到文件 perl
【发布时间】:2017-09-27 08:45:52
【问题描述】:

问题

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

我在 exec 中运行 vlc,但由于我怀疑每个人都设置了它,所以我用下面的 echo 替换了它,它显示了与示例相同的行为。

我只对 exec 'command','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 的输出重定向到文件?

额外

如果需要更多信息,请询问。

【问题讨论】:

  • 试试exec '/usr/bin/echo', 'done';
  • 您只是想将执行命令的输出发送到文件吗?
  • 认为 >/dev/null 是外壳的一部分。如果你运行exec '/usr/bin/echo', 'done' 不涉及shell,这就是参数列表的想法。如果没有外壳,就无法重定向。您需要找到一种不同的方法来更改程序获得的句柄。但我不知道有多不幸。
  • @simbabque 看起来改变 STDOUT 确实有效,只是奇怪地不适用于 select
  • 其实是有道理的。 select 不会更改 STDOUT。它改变了 Perl 默认用来写入的句柄。我没有想到。做得好。 :)

标签: bash perl


【解决方案1】:

原来你可以在 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";
 }

【讨论】:

    【解决方案2】:

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

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

    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`;
    }
    

    【讨论】:

    • 同样,exec 不返回。它就像一个叉子,它运行并忘记。第一个示例中的print 行将永远无法到达。事实上,你的 Perl 会抛出一个警告来告诉你这一点。运行这段代码,你就会明白我的意思了:perl -E 'END{say"end"} exec q{sleep 5 && echo "foo"}; say "bar";'
    • @simbabque 我的错。固定。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多