Любой ввод-вывод обрабатывается системным вызовом, вызванным процессом. В конечном счете такой системный вызов будет сочиться свой путь вниз к некоторой соответствующей функции драйвера устройства низкого уровня для выполнения фактической операции ввода-вывода.
Ввод-вывод может быть хитрым - для фактического вкладывания данных и из устройства, различные шаги, возможно, должны быть выполнены в порядке и возможно с синхронизацией требований. Если эти шаги не завершаются атомарно, в следующий раз, когда их пробуют, устройство не может ответить, неправильно себя вести или даже вызвать систему к тупику. Эти шаги могут отличаться и могут быть уникальными для каждого устройства, следовательно почему существует столько драйверов устройств.
Правильно написанный драйвер устройства должен знать, как иметь дело с устройством, которое он пытается обслужить, таким образом, он не должен обычно испытывать проблемы, если нет ошибка драйвера, Вы используете неправильный драйвер для устройства, или физическое устройство перестало работать.
Проблема состоит в том, что Вы читаете файл с двумя экземплярами read
- один для чтения имени файла другое для получения ответа. Следовательно read
ожидание ответа ест каждое второе имя файла, и необходимо надеяться, что список файлов не похож:
some_throuwaway_stuff
foo
very_important_file.txt
Yes
some_throuwaway_stuff
foo
Ваш сценарий должен, вероятно, посмотреть что-то как:
#!/bin/bash
echo "Give directory to search for ASCII text files"
read direct
exec 3<&0
find "$direct" -type f |
while IFS= read -r name; do
echo "========================================"
if file "$name" | grep ASCII; then
echo "----------------------------------------"
head "$name";
echo "----------------------------------------"
echo "Do you want to delete this file?"
read -u 3 want
case $want in
YES|Yes|yes|Y|y)
rm "$name"
;;
*)
;;
esac
fi
done
Заметьте перенаправление exec 3<&0
который будет питаться регулярный stdin
к дескриптору файла 3, который затем проверяется в цикле на ответ от пользователя.
Тем не менее rm -i
вероятно более оптимальный вариант.
Вы можете заменить ваш блок
while [ $numb -gt 0 ]
do head ${!numb}
echo "Do you want to delete ${!numb} file?"
read want
case $want in
yes)
rm ${!numb}
echo "File is removed"
sleep 1;;
Yes)
rm ${!numb}
echo "File is removed"
sleep 1;;
Y)
rm ${!numb}
echo "File is removed"
sleep 1;;
y)
rm ${!numb}
echo "File is removed"
sleep 1;;
YES)
rm ${!numb}
echo "File is removed"
sleep 1;;
esac
numb=$[$numb-1]
done
на
while [ $numb -gt 0 ]
do
head ${!numb}
rm -i ${!numb}
numb=$[$numb-1]
done
rm
кому:rm -f
– بارپابابا 17.06.2014, 17:36rm
имеет много полезных опций, которые могут быть или выгодными или нанести ущерб Вашим данным в зависимости от того, что Вы делаете. – peterph 18.06.2014, 13:08