В первом цикле он ждет, пока пользователь что-то напечатает, а во втором - нет.

for f in *; do
  echo $f
  IFS= read -r opt
done

find . -maxdepth 1 -type f -name "*" | while read f; do
  echo $f
  IFS= read -r opt
done

Вопрос

Как я могу заставить цикл while ждать ввода пользователя так же, как это делает цикл for?

0
Sandra Schlichting 2 Май 2018 в 01:09

1 ответ

Лучший ответ

Проблема в том, что цикл происходит в конвейере, поэтому стандартный ввод перенаправляется на вывод предыдущей команды конвейера. Вы можете использовать exec для перенаправления обычного стандартного ввода в другой дескриптор файла и чтения оттуда ввода пользователя:

exec 3<&0
find . -maxdepth 1 -type f -name "*" | while read f; do
  echo $f
  IFS= read -r -u3 opt
  echo $opt
done
exec 3<&-  # Close fd3
2
choroba 1 Май 2018 в 22:20