Очевидно, что 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
}