Вот выдержка из скрипта bash для перенастройки grub

    OLD="/etc/default/grub"
    NEW="/tmp/default.grub"
    SEC="1"

    cp "$OLD" "$NEW" || { >&2 echo "Couldn't copy $OLD" && exit 1; }

    sed -i "s/GRUB_TIMEOUT=[0-9]\+/GRUB_TIMEOUT=3/$SEC" "$NEW"

    cp_if_change_confirmed "$NEW" "$OLD"

    diff "$OLD" "$NEW" >/dev/null 2>&1 && \
    {
        CFG="$NEW.made"

        grub2-mkconfig --output="$CFG"

        echo "made $CFG from $NEW"

        cp_if_change_confirmed "$CFG" "/boot/grub2/grub.cfg"

        echo rm "$CFG"
        rm "$CFG"
    }

    echo rm "$NEW"
    rm "$NEW"

Окончательный вывод echo и rm строк

rm /tmp/default.grub.made
rm /tmp/default.grub.made
rm: cannot remove ‘/tmp/default.grub.made:‘ No such file or directory

Каким-то образом NEW присваивается значение CFG .

Глядя в cp_if_change_confirmed , которая является функцией bash, она содержит

NEW="$1"

Что, я думаю, объясняет проблему - эти переменные не имеют достаточно ограниченного объема.

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

Могу ли я сделать это в bash, или это безнадежный случай, и мне просто нужно быть бдительным в отношении имен переменных или использовать настоящий язык?

1 ответ1

1

Используйте local . Обратите внимание, что bash имеет только область действия функции (например, var в JavaScript), а не область видимости блока.

myfunc() {
    local foo bar=$1 baz=$2
    foo=/tmp/$bar
    echo "value inside: $foo, $bar"
}
foo=123 bar=234
myfunc quux
echo "value outside: $foo, $bar"

Если у вас есть блок , который не нуждается в какой - либо настойчивости, вы можете вызвать подоболочку с помощью ( ... ):

foo=123
( foo=345; echo "value inside: $foo" )
echo "value outside: $foo"

Обратите внимание, что подоболочки имеют все издержки fork() - это независимые процессы. Также они не позволяют вам выбирать, какие переменные локализовать - это все или ничего.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .