【发布时间】: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 默认用来写入的句柄。我没有想到。做得好。 :)