Как циклически повторить через фоновые изображения личинки каждую начальную загрузку

Окончательный ответ уже отправляется

Прежде, чем считать весь вопрос отмечают ответ ниже.

Короткая версия вопроса

В Bash, как я могу найти следующий объект в этом файле?

  • .../640x480-a.jpg
  • .../640x480-b.jpg
  • .../640x480-c.jpg

Когда текущий объект встраивается в эту строку?

GRUB_BACKGROUND="/home/rick/Pictures/Wallpaper/640x480-a.jpg"

Если текущий объект является последней записью файла, то первая запись файла должна быть выбрана. Новая запись должна быть обновлена в личинке для следующей начальной загрузки.

Что было сделано до сих пор

У меня есть несколько фоновых изображений для Личинки. Вручную редактирование /etc/default/grub изменить фоновое изображение и затем выполнение sudo update-grub является трудоемким, и я, вероятно, забуду делать это. Я хотел бы его автоматически сделанный каждая начальная загрузка / перезагрузка.

Я имею, устанавливают названное задание крона /etc/cron.d/cycle-grub-background содержа:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

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

Проигнорируйте код ниже заполненного предположениями и опасными ошибками

Следующий код только предоставлен для исторической ссылки. Не используйте ни один из него, поскольку это плохо повреждается и плохого дизайна.

Файл /usr/local/bin/cron-reboot-cycle-grub-background содержит:

#!/bin/bash

# NAME: cron-reboot-cycle-grub-background
# DATE: February 18, 2017
# PATH: /usr/local/bin/

# DESC: Cycle through available 640x480 wallpaper for grub background

# Get list of all grub images when 1920x1080 monitor has been downgraded
# to more readable 640x480 pixel format
ls /home/rick/Pictures/Wallpaper/640x480* > /tmp/grub-backgrounds

# Find this boot grub background image name
cat /etc/default/grub | grep BACKGROUND > /tmp/grub-background

# case? to find current background in backgrounds?
# Can we run systemd inhibit lock to prevent shutdown or reboot now?
# sed? to change to next background in /etc/default/grub

# Copy /etc/default/grub to /boot/grub/grub.cfg is the same as
# running sudo update-grub with out the 12 second delay

cp /boot/grub/grub.cfg /boot/grub/grub.cfg~
cp /etc/default/grub   /boot/grub/grub.cfg
# Can we release systemd inhibitor now?

# Now next reboot will have new background image
exit 0

Скажем, файл /tmp/grub-backgrounds содержит:

640x480-a.jpg
640x480-b.jpg
640x480-c.jpg

Скажем, файл /tmp/grub-background содержит:

GRUB_BACKGROUND="/home/rick/Pictures/Wallpaper/640x480-a.jpg"

Затем следующее изображение в списке было бы ...640x480-b.jpg.

Но если текущее изображение ...c.jpg затем следующий сброс изображения к началу списка и должен быть ...a.jpg.

Я должен добиться невозможного, как это было. Я думаю своего рода file case сопровождаемый sed в порядке (как Вы видите комментариями к коду), но я не могу вполне перенести свой ум вокруг этого.

Как всегда, я благодарен за любого и все идеи.

2
задан 19 February 2017 в 21:49

2 ответа

Короткий ответ

#!/bin/bash

CURR_FILE=$(cat /etc/default/grub | grep BACKGROUND) # Get grub current line
CURR_FILE=$(cut -d "=" -f 2 <<< "$CURR_FILE")        # File name only
CURR_FILE=$(echo "$CURR_FILE" | tr -d '"')           # Remove double quotes

for ALL_FILES in /home/rick/Pictures/Wallpaper/640x480*; do # Loop through every file
    if [[ "$FIRST_FILE" == "" ]]; then
        FIRST_FILE="$ALL_FILES"
    elif [[ "$MATCH_FILE" != "" ]]; then
        NEXT_FILE="$ALL_FILES"
        break # We've got it!
    fi
    if [[ "$CURR_FILE" == "$ALL_FILES" ]]; then
        MATCH_FILE="$ALL_FILES" # We found our current file entry
    fi
done

# If $NEXT_FILE empty we hit end of list so use First file name
if [[ "$NEXT_FILE" == "" ]]; then
    NEXT_FILE="$FIRST_FILE"
fi

# replace background file name in grub source file
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /etc/default/grub

# replace background file name in grub configuration file
# Backup... just in case :)
cp /boot/grub/grub.cfg /boot/grub/grub.cfg~
# Short cut so we don't have to run `sudo update-grub`
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /boot/grub/grub.cfg

Кредиты

После большого поиска с помощью Google этим утром наряду с методом проб и ошибок проблемой составляли решенных 90%. Затем с невероятной помощью в чат-комнате от Pilot6, Terdon и Zanna самая твердая часть для меня (использование sed) был решен.

Внимательные комментарии были также добавлены статьей-netbox, и Командующий Байта, делающий, Спрашивают чат-комнату Ubuntu самое дружественное большая часть гомогенной технической чат-комнаты, которую я часто посещал за свои два десятилетия в сети.

Назовите сценарий каждой начальной загрузкой с кроном

Создайте файл /etc/cron.d/cycle-grub-background содержа:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

Примечание: создайте использование файла sudo полномочия. Никакая потребность отметить его как исполняемый файл, но выполнение так не причинит боль также.

Длинный Ответ с отладкой и объявления переменной

#!/bin/bash

# NAME: cron-reboot-cycle-grub-background
# DATE: February 18, 2017. Modified April 9, 2017.
# PATH: /usr/local/bin/

# DESC: Cycle through available wallpaper for grub background


CURR_FILE=$(cat /etc/default/grub | grep BACKGROUND) # Get grub current line
echo "Grub line:    $CURR_FILE"

CURR_FILE=$(cut -d "=" -f 2 <<< "$CURR_FILE") # File name only
CURR_FILE=$(echo "$CURR_FILE" | tr -d '"')    # Remove double quotes

echo "Current file: $CURR_FILE"

FIRST_FILE=""
NEXT_FILE=""
MATCH_FILE=""

for ALL_FILES in /home/rick/Pictures/1600x900/*; do # Loop through every file
    if [[ "$FIRST_FILE" == "" ]]; then
        FIRST_FILE="$ALL_FILES"
    fi
    if [[ "$MATCH_FILE" != "" ]]; then
        NEXT_FILE="$ALL_FILES"
        break # We've got it!
    fi
    if [[ "$CURR_FILE" == "$ALL_FILES" ]]; then
        MATCH_FILE="$ALL_FILES" # We found our current file entry
    fi
done

# If $NEXT_FILE empty we hit end of list so use First file name
if [[ "$NEXT_FILE" == "" ]]; then
    NEXT_FILE="$FIRST_FILE"
fi

echo "First file:   $FIRST_FILE"
echo "Match file:   $MATCH_FILE"
echo "Next file:    $NEXT_FILE"

# replace background file name in grub source file
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /etc/default/grub

# replace background file name in grub control file
# Backup... just in case :)
cp /boot/grub/grub.cfg /boot/grub/grub.cfg~
# Short cut so we don't have to run `sudo update-grub`
sed -i "s|$CURR_FILE|$NEXT_FILE|g" /boot/grub/grub.cfg

# Now next reboot will have new background image
exit 0

Несколько примечаний

Длинный ответ версии использует другое имя каталога изображения, чем короткая версия. В любом случае необходимо обновить к любому каталогу, в котором хранятся изображения.

sed обычно использование / как разделитель однако наш путь/имена файлов содержат / таким образом, мы используем | вместо этого.

Условный метод после изменения /etc/default/grub должен работать sudo update-grub. Однако это занимает 12 секунд на моей машине, машина могла быть перезагружена, в то время как этот долгий процесс выполнялся. Учитывая, что systemd-inhibit должен был бы использоваться.

Использование короткого пути sed искать и заменять в /boot/grub/grub.cfg. Резервное копирование файла сделано на всякий случай, что-то идет не так, как надо. Путем перезагрузка крона является установкой на этой машине однако, процесс завершается к тому времени, когда пароль входа в систему вводится, и окно терминала открыто для проверения обновления.

2
ответ дан 2 December 2019 в 02:48

Простой скрипт, запущенный из любого из сценариев запуска Вашей системы, может позволить ступать через изображения обоев в конкретную папку, один шаг на перезапуск. Это намного быстрее, чем использование update-grub и намного более простая логика, плюс он никогда не должно работать update-grub. Оборотные стороны - то, что, если Вы хотите добавить изображение к списку, необходимо отредактировать сценарий или записать немного более сложный для обработки длины списка переменных, и Вы не можете сказать от имен файлов, какое изображение находится в каждом файле.

mv wallpaper3.png wallpaperx.png
mv wallpaper2.png wallpaper3.png
mv wallpaper1.png wallpaper2.png
mv wallpaperx.png wallpaper1.png

Даже со списком десятков файлов, более длительная, реальная версия этого сценария должна выполниться в части секунды на SSD, или в паре секунд на диске диска. Это просто, логика очевидна, и Вы не зададитесь вопросом, месяцы или несколько лет спустя, что этот сценарий, названный Вашим запуском, как предполагается, делает.

1
ответ дан 2 December 2019 в 02:48

Другие вопросы по тегам:

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