Resposta curta
#!/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
Créditos
Depois de muito googling esta manhã, juntamente com tentativa e erro, o problema foi resolvido em 90%. Então, com incrível assistência na sala de bate-papo de Pilot6 , Terdon e Zanna foi a parte mais difícil para mim (usando sed
) foi resolvida.
Consideráveis comentários também foram publicados por cl-netbox e Byte Commander fazendo Pedir à sala de bate-papo do Ubuntu a sala de bate-papo técnico mais homogênea que eu já visitei minhas duas décadas na net.
Roteiro de chamada a cada inicialização com o cron
Crie o arquivo /etc/cron.d/cycle-grub-background
contendo:
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
NOTA: crie um arquivo usando sudo
powers. Não há necessidade de marcá-lo como executável, mas isso também não fará mal.
Resposta longa com declarações de depuração e variável
#!/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
Algumas notas
A resposta da versão longa usa um nome de diretório de imagem diferente da versão curta. Em ambos os casos, você precisa atualizar para qualquer diretório em que suas imagens estejam armazenadas.
sed
geralmente usa /
como um delimitador, mas nossos nomes de caminho / arquivo contêm /
, então usamos |
.
O método convencional depois de alterar /etc/default/grub
é executar sudo update-grub
. No entanto, isso leva 12 segundos em minha máquina. A máquina pode ser reinicializada enquanto esse processo demorado está sendo executado. Dado que systemd-inhibit
teria que ser usado.
O atalho usa sed
para pesquisar e substituir em /boot/grub/grub.cfg
. Um backup do arquivo é feito apenas no caso de algo dar errado. A maneira como a reinicialização do cron é configurada nesta máquina, entretanto, o processo é concluído no momento em que a senha de login é digitada e uma janela de terminal é aberta para verificar a atualização.