Я рекомендую установить единственную версию Личинки в Вашем загрузочном секторе, том от Вашего самого стабильного распределения. Если Вы имеете другие операционные системы, устанавливаете их загрузчик в первом секторе их собственного раздела и chainload он от Личинки начальной загрузки. Тем путем у Вас всегда будет загрузочная система, и все механизмы обновления будут работать, как разработано.
Сценарии установки личинки способны к обнаружению ядер от других установок Linux также. Это - хорошее дополнительное, но это подвержено повреждению, например после того, как Вы обновили ядро, но не загрузили основную операционную систему. Так используйте то средство только в дополнение к chainloading.
(Но действительно, кто двойные начальные загрузки в наше время? С виртуальными машинами можно выполнить все Ose одновременно!)
Функции являются общим способом уменьшить дублирование кода. Этот случай несколько не отличается. Вы просто должны для определения функции для реализации Вашего while read
логика.
myfunc() {
while read LINE
do
prog_1
prog_2
...
prog_n
done
}
if [[ -t 0 ]]; then
myfunc # read stdin passed to the script
else
myfunc < "$1" # redirect file to stdin
fi
Я обычно использую
cat "$@" | while read line ; do
...
done
Единственная проблема могла бы состоять в том, если кто-то звонит someprog | myscript file.txt
(но та же проблема существует в исходном коде).
Если аргумент дан, перенаправление stdin от него затем снова используют код.
if [ -t 0 ]; then
exec 3<&0
elif (( $# > 0 )) && [[ -r $1 ]]; then
exec 3<"$1"
else
echo no stdin and no file to read
exit 1
fi
while IFS= read -r -u 3 LINE; do
prog_1
prog_2
...
prog_n
done
exec 3<&-