我对 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/