Ответ 1
Считывание с управляющего терминального устройства:
read input </dev/tty
Дополнительная информация: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
У меня есть bash script, что-то вроде следующего,
cat filename | while read line
do
read input;
echo $input;
done
но это явно не дает мне правильный результат, как когда я читаю в цикле while, который он пытается прочитать из имени файла файла из-за возможного перенаправления ввода-вывода.
Любой другой способ сделать то же самое?
Считывание с управляющего терминального устройства:
read input </dev/tty
Дополнительная информация: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
Вы можете перенаправить стандартный 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
Попробуйте изменить петлю следующим образом:
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
Похоже, вы читаете дважды, чтение внутри цикла while не требуется. Кроме того, вам не нужно вызывать команду cat:
while read input
do
echo $input
done < filename
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