У меня есть скрипт, который каждый день обновляет фон моего рабочего стола с помощью NASA APOD. После обновления до 11.10 этот скрипт перестал работать, предположительно, потому, что я использую gconftool-2
чтобы фактически обновить фон рабочего стола. Есть ли новый способ сделать это в Unity?
И Unity, и Gnome Shell (Gnome 3) теперь используют GSettings вместо GConf. Таким образом, в Unity и Gnome Shell вы можете использовать инструмент командной строки gsettings
за это. Нравится gconftool
, он позволяет вам получить или установить индивидуальный ключ.
Вы можете получить текущий URI фонового изображения следующим образом:
gsettings get org.gnome.desktop.background picture-uri'file:///home/serrano/Pictures/x.jpg'
И установите фоновый URI следующим образом (который немедленно обновит фон вашего рабочего стола):
gsettings set org.gnome.desktop.background picture-uri file:///home/serrano/Pictures/y.jpg
Обратите внимание, что вы должны добавить в URI "file://", чтобы это сработало (в отличие от gconftool
).
Чтобы заставить ваш скрипт работать как с Gnome 2, так и с Shell / Unity, вы можете сначала позволить ему выполнить проверку версии Gnome:
gnome-session --version
Это вернет версию Gnome. Если номер версии начинается с 3, то gsettings
может быть использован. Если он возвращает версию, начинающуюся с 2, пусть ваш скрипт использует gconftool
вместо.
Этот код случайным образом изменяет обои из заданного каталога.
#!/bin/bashDIR="/home/indra/Pictures/wallpapers"PIC=$(ls $DIR/* | shuf -n1)gsettings set org.gnome.desktop.background picture-uri "file://$PIC"
Сохраните этот скрипт и отредактируйте его с помощью команды "crontab -e" (она запускает редактор, в котором вы помещаете эту строку в конец файла):
*/1 * * * * /bin/bash /path/to/script.sh
Вступление
Этот ответ является редакцией исходного ответа. По мере того, как я продвигался в своих исследованиях Ubuntu и Linux, я открыл для себя множество подходов и углубил свое понимание того, как работает настройка фона в Ubuntu. Этот ответ - моя попытка как можно лучше задокументировать то, что я узнал до сих пор, и делается в надежде, что этот материал может быть полезен другим.
Важной частью является то, что для установки фона для рабочего стола Unity из командной строки вы можете использовать
gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
Настройка фона в Unity против рабочего стола bare X
Принцип работы Unity таков, что внизу находится голый рабочий стол X, а вверху - окно рабочего стола Unity (которое на самом деле является специальным экземпляром окна Nautilus, файлового менеджера Ubuntu по умолчанию). Таким образом, когда вы звоните
gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
это задает фон для этого специального окна Nautilus. Когда вы отключаете значки на рабочем столе с помощью
gsettings set org.gnome.desktop.background show-desktop-icons false
это убьет рабочий стол Nautilus и покажет вам голый рабочий стол X. Для рабочего стола bare-bone X вы можете использовать feh
программа. В частности, эта команда:
feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg
Есть также альтернатива этому с графическим интерфейсом, nitrogen
. В feh
и nitrogen
подходы могут использоваться с рабочими столами, отличными от Unity, например openbox
или blackbox
. В gsettings
подход может быть использован с Unity или другим рабочим столом на базе GNOME.
Отключение команды gsettings
Что именно делает gsettings
командовать делать? Ну, во-первых, существует dconf база данных настроек для каждого пользователя, которая предназначена для замены устаревших GConf, и он доступен через любой dconf
команда или gsettings
. В частности , мы имеем здесь дело с org.gnome.desktop.background
схема и один из ее ключей, picture-uri
.
УРИ, это file:///home/JohnDoe/Pictures/cool_wallpaper.png
, на самом деле означает Единый идентификатор ресурса, который изначально был создан для использования в Интернете, но есть URI файла схема , которую мы здесь видим. Что круто в URI, так это то, что он дает путь в байтовом кодировании, если вы используете неанглийскую локаль, например, с моим китайским рабочим столом, у меня есть следующий URI для моего backgroun: 'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'
Написание сценариев с помощью gsettings
Конечно, писать команду каждый раз утомительно, и можно использовать немного магии сценариев. Например, вот что я установил в своем ~/.bashrc
так что я могу менять фон по своему желанию:
change_background() { FILE="'file://$(readlink -e "$1" )'" if [ "$FILE" != "'file://'" ] then gsettings set org.gnome.desktop.background picture-uri "$FILE" else echo "File doesn't exist" fi }
Эта функция может быть вызвана с абсолютным путем, например
change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg
или с относительным путем из текущего рабочего каталога
change_background Pictures/cool_wallpaper.jpg
Он также выполняет проверку, существует ли файл, и разрешает символические ссылки. Это может быть использовано в сценарии оболочки или как отдельная функция для ежедневного использования.
Конечно, это не единственный способ. У Python есть API для Gio (который является основной библиотекой, лежащей в основе gsettings
). Я написал gsettings_get
и gsettings_set
функции, которые были весьма полезны для других проектов, таких как Индикатор списка пусковых установок. В случае установки фона его также можно использовать, и я использовал его совсем недавно для этот вопрос. Вот упрощенная версия того же подхода:
#!/usr/bin/env python3"""Author: Serg Kolo , <1047481448@qq.com>Date: December, 21,2016Purpose: script for setting wallpaper, the pythonic wayWritten for: https://askubuntu.com/q/66914/295286"""from gi.repository import Gioimport os,sys,randomdef gsettings_set(schema, path, key, value): """Set value of gsettings schema""" if path is None: gsettings = Gio.Settings.new(schema) else: gsettings = Gio.Settings.new_with_path(schema, path) if isinstance(value, list): return gsettings.set_strv(key, value) if isinstance(value, int): return gsettings.set_int(key, value) if isinstance(value,str): return gsettings.set_string(key,value)def error_and_exit(message): sys.stderr.write(message + "\n") sys.exit(1)def main(): gschema='org.gnome.desktop.background' key='picture-uri' if len(sys.argv) != 2: error_and_exit('>>> Path to a file is required') if not os.path.isfile(sys.argv[1]): error_and_exit('>>> Path "' + sys.argv[1] + \ '" isn\'t a file or file doesn\'t exit') full_path = os.path.abspath(sys.argv[1]) uri = Gio.File.new_for_path(full_path).get_uri() gsettings_set(gschema,None,key,uri)if __name__ == '__main__': main()
Конечно, здесь применяются те же правила для скриптов: убедитесь, что он выполнен с помощью chmod +x set_wallpaper.py
и храните его в (предпочтительно) ~/bin
папка. Использование простое: ./set_wallpaper.py Picture/cool_image.py
Исходный код этого скрипта также доступен на моем GitHub репозиторий со многими другими скриптами тоже.
Также вы можете использовать это:
dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Благодаря потрясающему ответу Серрано я смог написать этот скрипт, который я использую как часть своих новых сценариев настройки машины для установки черного фона:
#! /bin/bashSRC_URI="https://i.imgur.com/uomkVIL.png"FNAME="/home/$USER/Pictures/black.png"wget "$SRC_URI" -O "$FNAME"gsettings set org.gnome.desktop.background picture-uri "$FNAME"