Прежде, чем считать весь вопрос отмечают ответ ниже.
В Bash, как я могу найти следующий объект в этом файле?
Когда текущий объект встраивается в эту строку?
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
в порядке (как Вы видите комментариями к коду), но я не могу вполне перенести свой ум вокруг этого.
Как всегда, я благодарен за любого и все идеи.
#!/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
. Резервное копирование файла сделано на всякий случай, что-то идет не так, как надо. Путем перезагрузка крона является установкой на этой машине однако, процесс завершается к тому времени, когда пароль входа в систему вводится, и окно терминала открыто для проверения обновления.
Простой скрипт, запущенный из любого из сценариев запуска Вашей системы, может позволить ступать через изображения обоев в конкретную папку, один шаг на перезапуск. Это намного быстрее, чем использование 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, или в паре секунд на диске диска. Это просто, логика очевидна, и Вы не зададитесь вопросом, месяцы или несколько лет спустя, что этот сценарий, названный Вашим запуском, как предполагается, делает.