Вот выдержка из скрипта 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, или это безнадежный случай, и мне просто нужно быть бдительным в отношении имен переменных или использовать настоящий язык?