2011-09-08 59 views
0

错误我发现下面我们老的脚本功能:问题有关KSH

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

有谁知道在KSH这个bug?

+0

在http://unix.stackexchange.com/上可能会做得更好 – Julian

回答

2

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

./generate_filelist.sh | f 

在你期望read -r读标准输入就好了,例如做

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

时显然,有(是?)在(某些)KSH,阻止同样的从功能工作(版本(S))的错误:

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

我foun 2臭虫可能是它,这取决于主要是你的平台上:

有可能(很多)更多的历史错误可以应用,我停止搜索,因为我不知道任何关于您的平台,或实际上脚本的设计平台。

所以相反,有一种解决方法,将stdin写入临时文件并从中读取。需要注意的是

  • 这改变语义(后只收到完整的文件阅读开始)
  • 好像那里是你的样品中一个错字($$TMPFILE,可能代替$TMPFILE?)(除非有KSH的另一种特性我不知道的,$$扩展到当前进程ID))

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

平台 - AIX。 –