Perl 怀疑系统的Unix返回状态(echo…)

Perl 怀疑系统的Unix返回状态(echo…),perl,Perl,我们有一个作业,它运行一个Perl脚本,准备3个文件头、内容、页脚,然后将它们合并到一个文件中 使用系统命令准备头文件 $ret = system("/usr/bin/echo '$hdr' > $HDR_FILE"); if ( $ret != 0 ) { print STDERR "**ERROR** error preparing header\n"; } 合并文件命令如下所示 $ret = system("/usr/bin/cat $HDR_FILE $CONTENT_

我们有一个作业,它运行一个Perl脚本,准备3个文件头、内容、页脚,然后将它们合并到一个文件中

使用系统命令准备头文件

$ret = system("/usr/bin/echo '$hdr' > $HDR_FILE");
if ( $ret != 0 )
{
   print STDERR "**ERROR** error preparing header\n";
}
合并文件命令如下所示

  $ret = system("/usr/bin/cat $HDR_FILE $CONTENT_FILE $TRLR_FIL > $OUTPUT_FILE");
    if ( $ret != 0 )
    print STDERR "**ERROR** merge failed\n";
在最近一次作业执行期间,我们没有看到任何头错误的痕迹,但最终输出文件$output_file在内容和预告片存在时没有头。 能


即使头文件为空,仍返回“0”状态?

我将通过更好的错误处理简化代码:

选项1:使用backtick

$ret = `/usr/bin/echo '$hdr' > $HDR_FILE 2>&1`;
if ( $? || $ret )
{
   print STDERR "**ERROR** error preparing header, error: $ret\n";
}
选项2:使用打印而不是回显

open(my $fh,'>',$HDR_FILE) or die "Cannot write to $HDR_FILE";
print $fh $hdr;
close($fh);

这可能与您的问题无关,但请在每个perl脚本中包含和。我忍不住觉得shell脚本应该用shell编写,perl脚本通常应该避免使用system,特别是对于所示的操作集。我们确实没有足够的信息来调试这个问题。我们看不到各种变量设置为什么。很明显,您发布的内容并不是运行脚本中的逐字逐句,因为如果仔细想想,“合并文件”中的if位不正确,则会出现语法错误。文件是空的,还是只包含一个换行符?如果它只包含一个换行符,那么Perl脚本中的$hdr不包含任何内容。对你的问题的简洁回答是肯定的;即使头文件为空,系统也可能返回0。只有在调用外壳程序失败,或者外壳程序无法创建用于I/O重定向的文件时,它才会失败。$hdr是从某些输入派生出来的,运行日志显示,所有必需的输入都可用于$hdr,但有些输入无法进入$hdr_文件。当我们立即重新运行作业时,这次我们在最终的输出文件中正确地使用了头文件,因此怀疑$ret=system/usr/bin/echo'$hdr'>$hdr_文件中是否发生了什么事情;
open(my $fh,'>',$HDR_FILE) or die "Cannot write to $HDR_FILE";
print $fh $hdr;
close($fh);