Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将exec的输出发送到perl文件 问题_Bash_Perl - Fatal编程技术网

Bash 将exec的输出发送到perl文件 问题

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

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

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

我只对exec的“command”和“args”格式的exec感兴趣,而不是生成shell的格式,因为它生成了一个带有vlc的子shell,该子shell仍然打印到屏幕上,并存在其他问题,无法干净地杀死它


代码
尝试 正如预期的那样,只打印“>/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";
 }