Bash 将exec的输出发送到perl文件 问题
在perl中运行exec时,我无法将输出重定向到文件 我在exec中运行vlc,但由于我怀疑每个人都设置了它,所以我在下面用echo替换了它,它在示例中显示了相同的行为 我只对exec的“command”和“args”格式的exec感兴趣,而不是生成shell的格式,因为它生成了一个带有vlc的子shell,该子shell仍然打印到屏幕上,并存在其他问题,无法干净地杀死它Bash 将exec的输出发送到perl文件 问题,bash,perl,Bash,Perl,在perl中运行exec时,我无法将输出重定向到文件 我在exec中运行vlc,但由于我怀疑每个人都设置了它,所以我在下面用echo替换了它,它在示例中显示了相同的行为 我只对exec的“command”和“args”格式的exec感兴趣,而不是生成shell的格式,因为它生成了一个带有vlc的子shell,该子shell仍然打印到屏幕上,并存在其他问题,无法干净地杀死它 代码 尝试 正如预期的那样,只打印“>/dev/null”,但值得一试 exec "/usr/bin/echo
代码
尝试 正如预期的那样,只打印“>/dev/null”,但值得一试
exec "/usr/bin/echo done >/dev/null";
运行sh,然后运行echo,在这里工作,但不是在我与vlc的实际问题上,我想我无论如何都会包括,因为肯定有人会建议它
问题:
使用“命令”和“参数”时,如何将此exec的输出重定向到文件
额外的
如果需要更多信息,请询问。我想如果您只需要打印到文件,这应该可以 捕获输出的最简单方法是使用反勾号
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`;
}
事实证明,您可以在执行之前更改文件描述符
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";
}
尝试执行“/usr/bin/echo”,“完成”您只是想将已执行命令的输出发送到一个文件吗?我认为
>/dev/null
是shell的一部分。如果运行exec'/usr/bin/echo','done',
则不涉及shell,这就是参数列表的概念。没有外壳,就无法重定向。您需要找到一种不同的方法来更改程序获得的句柄。但我不知道有多不幸。@simbabque看起来像是改变STDOUT确实起作用,只是奇怪地不是用select
?它实际上是有意义的<代码>选择不会更改标准输出。默认情况下,它会更改Perl用于写入的句柄。我没想到。干得好。:)同样,exec
不会返回。它就像一把叉子,跑了又忘了。第一个示例中的打印
行将永远无法到达。事实上,Perl抛出了一个警告来告诉您这一点。运行这段代码,您将看到我的意思:perl-E'END{say“END”}exec q{sleep 5&&echo“foo”};说“酒吧”;'代码>@simbabque我的错误。固定的。
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`;
}
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";
}