Чтение ввода в bash внутри цикла while

У меня есть bash script, что-то вроде следующего,

cat filename | while read line
do
    read input;
    echo $input;
done

но это явно не дает мне правильный результат, как когда я читаю в цикле while, который он пытается прочитать из имени файла файла из-за возможного перенаправления ввода-вывода.

Любой другой способ сделать то же самое?

Ответ 2

Вы можете перенаправить стандартный stdin через модуль 3, чтобы сохранить его внутри конвейера:

{ cat notify-finished | while read line; do
    read -u 3 input
    echo "$input"
done; } 3<&0

Кстати, если вы действительно используете cat таким образом, замените его перенаправлением, и все станет еще проще:

while read line; do
    read -u 3 input
    echo "$input"
done 3<&0 <notify-finished

Ответ 3

Попробуйте изменить петлю следующим образом:

for line in $(cat filename); do
    read input
    echo $input;
done

Unit test:

for line in $(cat /etc/passwd); do
    read input
    echo $input;
    echo "[$line]"
done

Ответ 4

Похоже, вы читаете дважды, чтение внутри цикла while не требуется. Кроме того, вам не нужно вызывать команду cat:

while read input
do
    echo $input
done < filename

Ответ 5

echo "Enter the Programs you want to run:"
> ${PROGRAM_LIST}
while read PROGRAM_ENTRY
do
   if [ ! -s ${PROGRAM_ENTRY} ]
   then
      echo ${PROGRAM_ENTRY} >> ${PROGRAM_LIST}
   else
      break
   fi
done