linux - 如何将此 perl 脚本的输出重定向到文件?

标签 linux shell perl

我对 perl 没有太多经验,非常感谢任何/所有反馈....

[开始之前:我无权更改现有的 perl 脚本。]

我每天多次运行几个 perl 脚本,但我想开始将它们的输出捕获到一个文件中。

第一个 perl 脚本不带任何参数,我可以毫无问题地“tee”它的输出:

/asdf/loc1/rebuild-stuff.pl 2>&1 | tee $mytmpfile1

第二个 perl 脚本使用此命令挂起:

/asdf/loc1/create-site.pl --record=${newsite} 2>&1 | tee $mytmpfile2

仅供引用,以下命令不会挂起:

/asdf/loc1/create-site.pl --record=${newsite} 2>&1

我想知道/asdf/loc1/create-site.pl 是否正在尝试处理 | tee $mytmpfile2 作为额外的命令行参数?我不允许共享整个脚本,但这是其主要例程的开始:

...
my $fullpath = $0;
$0 =~ s%.*/%%;

# Parse command-line options.
...
Getopt::Long::config ('no_ignore_case','bundling');
GetOptions ('h|help'               => \$help,
            'n|dry-run|just-print' => \$preview,
            'q|quiet|no-mail'      => \$quiet,
            'r|record=s'           => \$record,
            'V|noverify'           => \$skipverify,
            'v|version'            => \$version) or exit 1;
...

以上代码是否提供了任何线索?除了修改脚本之外,您是否有任何提示可以让我在文件中捕获其输出?

最佳答案

不是挂了。您正在“遭受缓冲”。和大多数程序一样,Perl 的 STDOUT 默认是缓冲的。与大多数程序一样,Perl 的 STDOUT 在连接到终端时由换行符刷新,否则缓冲 block 。当 STDOUT 未连接到终端时,在累积 4 KiB 或 8 KiB 输出(取决于您的 Perl 版本)或程序退出之前,您不会获得任何输出。

你可以添加$| = 1; 到脚本以禁用 STDOUT 的缓冲。如果您的程序以真值结束或使用 exit 退出,您可以在不更改 .pl 文件的情况下执行此操作。只需使用以下包装器:

perl -e'
   $| = 1;
   $0 = shift;
   do($0);
   my $e = $@ || $! || "$0 didn\x27t return a true value\n";
   die($e) if $e;
' -- prog args | ...

或者您可以使用 unbuffer 欺骗程序,让它认为它已连接到终端。

unbuffer prog args | ...

关于linux - 如何将此 perl 脚本的输出重定向到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50688298/

相关文章:

bash - 如何通过在 ubuntu 中包含 "cd"命令来运行 shell 脚本?

perl - 如何确定几个字符串中最长的相似部分?

perl - 我如何从 Perl 中的具体类继承?

perl - 如何在Perl中捕获完整的命令行?

linux - 在其他文件中查找文件名字符串的所有用法

java - 使用 Java JSch 在防火墙设备上通过 SSH "exec" channel 执行多个命令不起作用

linux - 多次传递具有不同参数的相同命令(从 linux 命令提示符)并将结果保存在单个文件中

linux - 两个组播问题

linux - AWS 为自动生成的文件设置文件权限

linux - 在linux中从文件名中删除根目录