Дублирование кода в сценарии оболочки

Я рекомендую установить единственную версию Личинки в Вашем загрузочном секторе, том от Вашего самого стабильного распределения. Если Вы имеете другие операционные системы, устанавливаете их загрузчик в первом секторе их собственного раздела и chainload он от Личинки начальной загрузки. Тем путем у Вас всегда будет загрузочная система, и все механизмы обновления будут работать, как разработано.

Сценарии установки личинки способны к обнаружению ядер от других установок Linux также. Это - хорошее дополнительное, но это подвержено повреждению, например после того, как Вы обновили ядро, но не загрузили основную операционную систему. Так используйте то средство только в дополнение к chainloading.

(Но действительно, кто двойные начальные загрузки в наше время? С виртуальными машинами можно выполнить все Ose одновременно!)

2
05.01.2014, 01:58
3 ответа

Функции являются общим способом уменьшить дублирование кода. Этот случай несколько не отличается. Вы просто должны для определения функции для реализации Вашего 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
5
27.01.2020, 21:50

Я обычно использую

cat "$@" | while read line ; do
    ...
done

Единственная проблема могла бы состоять в том, если кто-то звонит someprog | myscript file.txt (но та же проблема существует в исходном коде).

2
27.01.2020, 21:50

Если аргумент дан, перенаправление 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<&-
2
27.01.2020, 21:50

Теги

Похожие вопросы