Причина в том, что while
-команда выполняется внутри канала, что означает, что она выполняется внутри под-оболочки, поэтому назначения переменных не передаются вызывающей оболочке.
Одним из решений является перенаправление ввода (может потребоваться сначала записать его во временный файл):
while read f; do
...
done < foo.tmp
Другое решение - использовать стандартный вывод команды while для распространения значения PROCESSED
:
PROCESSED=`find | while read f; do
echo "Echo other stuff on stderr" >&2
echo 1
done`