Вопрос об ошибке в ksh - PullRequest
       0

Вопрос об ошибке в ksh

0 голосов
/ 08 сентября 2011

Я нашел следующую функцию в наших старых скриптах:

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

Кто-нибудь знает эту ошибку в KSH?

1 Ответ

2 голосов
/ 08 сентября 2011

Очевидно, что 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, о которой я не знал, $$ расширяется до идентификатора текущего процесса))

.

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