Сценарий оболочки, меняющий обои рабочего стола

Не могли бы вы написать самый простой сценарий оболочки, который будет менять обои рабочего стола (в Ubuntu) через равные промежутки времени (например, 1 минуту).

Обои будут сохранены в определенном каталоге (например, $HOME/wallpapers). Мне нужен только базовый функционал.

1) выберите случайные обои из $HOME/wallpapers
2) установите их в качестве обоев на рабочем столе
3) установите cron для запуска скрипта каждую минуту (не является частью вопроса).


person xralf    schedule 05.04.2011    source источник
comment
Может быть, это следует спросить на askubuntu.com?   -  person Kaivosukeltaja    schedule 05.04.2011
comment
Вот 5259 вопросов с тегами bash. На аскубунту только 144. Вопрос по программированию. Ubuntu больше относится к среде рабочего стола.   -  person xralf    schedule 05.04.2011
comment
В основном ответ на этот вопрос зависит от вашего окружения рабочего стола / оконного менеджера. Все в этом вопросе, в т.ч. OP, похоже, использует Gnome, поэтому инструменты gnome, использующие ответ, работают. Для будущих посетителей, использующих KDE/XFCE/LXDE/MATE/другие, спросите у своего DE, как он программно устанавливает свои обои.   -  person Nikana Reklawyks    schedule 17.07.2017


Ответы (6)


#!/bin/bash
wallpaperdir='$HOME/wallpaper'

files=($wallpaperdir/*)
randompic=`printf "%s\n" "${files[RANDOM % ${#files[@]}]}"`

gconftool-2 -t str --set /desktop/gnome/background/picture_filename "$randompic"

Сохраните этот скрипт и отредактируйте его с помощью команды «crontab -e» (он запускает редактор, где вы помещаете эту строку в конец файла):

*/1     *     *     *     *         /bin/bash /path/to/script.sh

изменить: я предположил, что вы используете gnome. Если нет, вам нужно отредактировать последнюю строку, потому что в моем примере используется Gnome Conftool. ;)

Чтобы изменить фон в XFCE, вы должны изменить строку с помощью gconftool-2 на:

echo -e “# xfce backdrop list\n$randompic”>$HOME/.config/xfce4/desktop/backdrops.list    
killall -USR1 xfdesktop
person tamasgal    schedule 05.04.2011
comment
Спасибо. Я использую гном и xfce. Не знаете ли вы, как изменить его и в XFCE? - person xralf; 05.04.2011
comment
Я использовал #!/bin/bash<br> files=(/home/xralf/wallpapers/*)<br> randompic=printf %s\n ${files[RANDOM % ${#files[@]}]}<br> cp "$randompic" desktop_picture.jpg<br> cp desktop_picture.jpg /usr/share/xfce4/backdrops<br> killall xfdesktop<br> xfdesktop, но это не работает должным образом. - person xralf; 05.04.2011
comment
Я отредактировал свой первый ответ, потому что функция комментариев не очень полезна для публикации кода ;-) - person tamasgal; 05.04.2011
comment
Это не работает. Могу ли я отправить вам файл куда-нибудь? Если нет ошибки? - person xralf; 05.04.2011
comment
Вы должны посмотреть $HOME/.config/xfce4/desktop/backdrops.list, он должен существовать, и после выполнения последней команды должна появиться новая запись. Но вы можете вставить файл на pastebin или что-то в этом роде, мы решим эту проблему ;-) - person tamasgal; 05.04.2011
comment
Извините, я пропустил ваш комментарий. Вот ссылка на pastebin. - person xralf; 08.04.2011
comment
Почему бы просто не gconftool-2 -t str --set /desktop/gnome/background/picture_filename "${files[RANDOM % ${#files[@]}]}" избавиться от бесполезной переменной randompic, подоболочки и уродливого синтаксиса? - person gniourf_gniourf; 26.12.2012
comment
Это не работает для меня. Пожалуйста, дайте более подробную информацию. Я использую последнюю версию Ubuntu 18.04.1 LTS x86_64 Desktop. - person Mohith7548; 26.08.2018

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

Из кода septi плюс некоторые модификации, вот мое решение:

#!/bin/bash
wallpaperdir="$HOME/wallpaper"

files=($wallpaperdir/*)
randompic=`printf "%s\n" "${files[RANDOM % ${#files[@]}]}"`

echo -e "# xfce backdrop list\n$randompic">$HOME/.config/xfce4/desktop/backdrop.list
xfdesktop --reload

Одинарные кавычки должны быть заменены двойными, чтобы компьютер правильно интерпретировал часть $HOME. Кроме того, вы хотите отредактировать файл backdrop.list, а не backdrops.list. И, наконец, я считаю, что использование killall в этом случае излишне, так как вы можете просто перезагрузить xfdesktop.

Я протестировал его на своем компьютере (Linux Mint Debian Edition), и он работает отлично.

Надеюсь, поможет. знак равно

РЕДАКТИРОВАТЬ: я забыл упомянуть, что вы должны добавить DISPLAY=:0.0 перед вашей командой в crontab. Это дает

*/1 * * * * DISPLAY=:0.0 wallpaper.sh
person Migwel    schedule 20.08.2012

Это просто мой подход к этому вопросу. Я не утверждаю, что это идеал.

WALLS_PATH=/path/to/images
cd $WALLS_PATH

while [ 1 ]; do
    for NEW_WALL in "$WALLS_PATH"/*; do
        gsettings set org.gnome.desktop.background picture-uri "file://${NEW_WALL}"
        sleep 1800
    done
done
person mackatozis    schedule 26.12.2012

Попробуйте это в новых версиях Ubuntu: gsettings set org.gnome.desktop.background picture-uri file:///path/to/img.jpg (подсказка из здесь< /а>)

person Jabba    schedule 05.04.2012

Для gnome3 вам нужно использовать gsettings вместо gconftool.

Но если вы собираетесь выполнять скрипт через cron, он не сработает.

Я пробовал много скриптов .sh, но ни один из них не работает для меня.

В конце концов, я исправил это с помощью этого скрипта Python, который загружает случайные обои из папки:

#!/usr/bin/env python
#coding: utf8 

import os,random
setup = "/path_to_folder/" + random.choice(os.listdir("/path_to_folder/"))
os.system("DISPLAY=:0 GSETTINGS_BACKEND=dconf gsettings set org.gnome.desktop.background picture-uri  'file://%s'" %(setup))

Надеюсь, это поможет кому-то с моей такой же проблемой!

person tomeu_quely    schedule 28.05.2014

Это сработало для меня в Gnome:

#!/bin/bash

DIR="/home/user/Pictures/wallpapers"
PIC=$(find $DIR -type f -maxdepth 1 | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"
person Indra    schedule 12.08.2014
comment
Однако одно короткое примечание: не полагайтесь на/анализируйте результаты ls, более подходит find. - person ; 12.10.2017