抑制从awk脚本调用的系统命令

Suppressing system command called from awk script

我目前 运行 这个脚本在 Windows 7.

所以,我有一个程序,用于对另一个命令 (mkmk) 的输出进行颜色编码,并计算不同数量的错误和其他值得注意的统计数据等。所以现在,它以批处理文件的形式开始,它

  1. 关闭回显
  2. 将一些颜色值设置为变量
  3. 同时调用 mkmk 命令和 awk 脚本

然后 awk 脚本逐行解析,并调用一个函数,然后调用一个执行着色的 exe。工作原理如下:

/: error/ {
    CntError++ ;
    TraError[CntError] = [=10=];
    colorf(cErrorDcb,[=10=]) ;
    next
}    

function colorf(fg, str ) {
   if ( Couleur < 1 )
   {
     printf("%s\n",str);
   }     
   else
   { 
      if ( System == "UNIX" )
      {
         printf("%s%s%s%s\n",fg,bg,str,NORMAL);
      }
      else 
      {
         system("Colorize.exe /c:" fg " \""  str "\"");
         printf("\n");
      }
   }
}

所以,一切正常,除了每次调用 system("Colorize.exe") 时(很多),命令在终端中输出并使输出混乱。它似乎不受我的批处理文件中的 @echo off 命令的影响,因为它是在 awk 脚本中调用的。有没有办法只隐藏这些系统命令,但保留我的 awk 输出的其余部分?

我不知道神奇的 Windows 咒语是什么来控制终端上显示的内容,但通常不是调用 system() 并让它调用的命令产生它自己的混合输出在 awk 输出中,使用 getline 读取调用结果以填充变量,然后从 awk 打印该结果。像这样:

/: error/ {
    TraError[++CntError] = [=10=]
    print colorf(cErrorDcb,[=10=])
    next
}    

function colorf(fg, str,         cmd, line, colorStr) {
   if ( Couleur < 1 ) {
      colorStr = str
   }     
   else if ( System == "UNIX" ) {
      colorStr = fg bg str NORMAL
   }
   else {
      cmd = "Colorize.exe /c:" fg " \""  str "\""
      colorStr = ( (cmd | getline line) > 0 ? line : str )
      close(cmd)
   }
   return colorStr
}

我也去掉了所有无用的分号。

最佳建议 - 得到 cygwin!