关于ksh中的bug的问题

时间:2011-09-08 14:54:37

标签: ksh

我在旧脚本中找到了以下功能:

f() {    # < files list
   typeset file
   cat - > $TMPFILE   # Bug in KSH
   while read -r file
   do
      process $file
   done < $TMPFILE
}

有没有人知道KSH中的这个错误?

1 个答案:

答案 0 :(得分:2)

显然f()是一个过滤函数,即你应该在像这样的管道中使用它

./generate_filelist.sh | f

你希望read -r能够很好地阅读stdin,例如做什么时

./generate_filelist.sh | while read -r file; do echo $file; done

显然,(某些)ksh(版本)中存在(是?)一个错误,它阻止了某个函数的运行:

f() {
   typeset file
   while read -r file # whoops not reading from stdin as it should?
   do
      process $file
   done
}

我发现了两个错误,主要取决于你的平台:

可能会有(很多)更多的历史错误可以应用,我停止搜索,因为我对您的平台或脚本设计的平台一无所知。

因此,有一种解决方法,包括将stdin写入临时文件,并从中读取。注意

  • 这会改变语义(仅在收到完整文件后开始阅读)
  • 您的示例中似乎有一个拼写错误($$TMPFILE,可能代替$TMPFILE?)(除非KSH还有其他一个我不知道的功能,$$扩展到当前流程Id))

f() {
   typeset file
   cat - > $TMPFILE
   while read -r file
   do
      process $file
   done < $TMPFILE
}