Perl - 如何抑制分叉子进程的输出

问题描述 投票:0回答:2

我有一个 perl 脚本,它必须在 exec 中调用 tar。

exec("tar zcf /tmp/mytarball.gz directoryToTarBall > /dev/null 2>&1" or die ("$!")

这是我分叉的一个子进程,同时,我通过向 STDOUT 写入句号来监视 tar 的进度。 我遇到的问题是,我不希望 tar 在创建 tarball 时变得冗长 - 我不希望输出回显到标准输出......我只希望进度计数器(句号)回显到屏幕。 我以为我可以在 exec 命令中传递

>/dev/null 2>&1
,但这不起作用。

任何想法都受到热烈欢迎。谢谢和问候

perl process fork stdout
2个回答
3
投票

使用

exec LIST
形式以避免由于 shell 引用而出现意外。这还需要执行 shell 为您执行的重定向。

use 5.10.0;  # //

my $pid = fork // die "$0: fork: $!";   # / fix Stack Overflow highlighting
if ($pid) {
  waitpid $pid, 0 or die "$0: waitpid: $!";
  warn "$0: child exited abnormally" if $?;
  print ".\n";  # done!
}
else {
  open STDOUT, ">",  "/dev/null" or die "$0: open: $!";
  open STDERR, ">&", \*STDOUT    or exit 1;
  exec "tar", "zcf", "/tmp/mytarball.gz", "directoryToTarBall";
  exit 1;
}

0
投票
perl -e 'exec("ls >/dev/null")'

至少对我有用。正在尝试

2>&1

这种错综复杂的混乱也有效

perl -e 'exec("ls >&2 2>&1 1>/dev/null")'

即使这有效,我认为它可能不应该

perl -e "exec(\"ls 1>&2 >/dev/null\")"

你到底卡在哪里了?

© www.soinside.com 2019 - 2024. All rights reserved.