如果我想获得命令的输出,如何解决错误“命令行太长”?

时间:2019-05-03 12:16:03

标签: perl pipeline

我有一个带有非常长命令的perl代码,我想将输出打印到日志文件中。看起来像这样:

system ( "$cmd  | tee -a $log_file" );

当我运行Perl脚本时,系统调用会抛出“命令行太长”。

如果我在没有管道的情况下运行系统调用,那么它将起作用。

所以我的问题是:

  1. 管道的字符数有限制吗?
  2. 如何解决该问题?

一些其他信息:

命令$cmd的长度为8532。我使用的是Perl版本5.003_07(是的,我知道它很旧。我的公司是所有者。)

1 个答案:

答案 0 :(得分:1)

那是Perl的肯定古老版本。我使用的第一个是90年代中期的5.004。当然,情况可能已经改变,但是我认为system()文档中的以下引用仍然有意义。

  

如果只有一个标量参数,则检查该参数是否包含shell元字符,如果有,则将整个参数传递给系统的命令shell进行解析(在Unix上为“ / bin / sh -c”平台,但在其他平台上有所不同)。如果参数中没有外壳元字符,则将其拆分为单词并直接传递给“ execvp”,这样效率更高。

您似乎在经历这两种情况之间的差异,并且(外部)shell程序在添加管道时强加了长度限制。

您可以通过以下方式解决此问题:将STDOUT临时重新打开为“ | tee -a $ log_file”,然后仅执行system($cmd)。我不敢告诉您在如此古老的Perl版本下该怎么做(特别是如果您以后要恢复旧的STDOUT),因为随着时间的流逝,这肯定已经发生了变化。您需要查阅手头的文档。

一种可能性是fork(),然后在子流程open STDOUT, "| tee -a $log_file"exec($cmd),在父流程wait()中完成所有操作,请牢记因为您打开了一个管道,所以存在多个子进程。