【发布时间】:2018-06-04 20:29:02
【问题描述】:
我在 perl 方面没有太多经验,如果有任何/所有反馈,我将不胜感激......
[开始之前:我无权更改现有的 perl 脚本。]
我每天多次运行几个 perl 脚本,但我想开始将它们的输出捕获到一个文件中。
第一个 perl 脚本不带任何参数,我可以毫无问题地“输出”它的输出:
/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;
...
上面的代码是否提供了任何线索?除了修改脚本之外,您还有什么技巧可以让我将其输出捕获到文件中吗?
【问题讨论】:
-
不,您在此处提供的代码没有提供任何线索。请在询问您是否提供 minimal reproducible example 之前进行测试 - 尽可能短的代码,让其他人在不更改运行时直接看到问题。
-
要清楚,你的脚本不可能自己处理
| tee ...;该操作甚至在脚本启动之前由 shell 执行,因此 perl 脚本无法更改tee调用。它确实能够检查其 stdout 和 stderr 是针对 TTY 还是 FIFO 并在此基础上更改其行为,但是您在此处提供的代码都没有进行该检查。 -
另外值得注意的是,默认缓冲行为可以根据 FIFO / TTY 的确定而改变;请参阅BashFAQ #9 进行一些介绍性讨论。