Как изменить фон рабочего стола из командной строки в Unity?

63

У меня есть скрипт, который обновляет фон моего рабочего стола каждый день с помощью НАСА APOD. После обновления до 11.10 этот скрипт перестал работать, предположительно потому, что я использую его gconftool-2для обновления фона рабочего стола. Есть ли новый способ сделать это в Unity?

Shaddi
источник

Ответы:

82

И 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вместо этого.

Serrano
источник
Я использовал эту команду в Ubuntu 12.04, и система
2
@YumYumYum: Очень необычно, что вышеперечисленные команды могут привести к сбою в вашей системе, если в вашей системе не происходит что-то еще.
Серрано
Вы можете добавить Cinnamon в список Desktop Environment, используя gsettings;)
MrVaykadji
Обратите внимание, что вы должны добавить URI к «file: //», чтобы это работало (в отличие от gconftool). <- Это важно! Я не нашел это упомянуто явно где-либо еще.
Том
2
Это хорошо для текущего пользователя, вошедшего в систему. Я хотел бы знать, как программно менять обои другого пользователя! Я попробовал sudo --user = <username> gsettings ... но это не удалось.
Кайван
12

Этот код случайным образом меняет обои из данного каталога.

#!/bin/bash

DIR="/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
Индра
источник
1
Каталог обоев должен содержать только файлы обоев, а не каталог.
loxaxs
Однако, gsettings не будет работать с cron. вам нужно установить переменную среды DBUS_SESSION_BUS_ADDRESS, чтобы gsettings работали. Вы можете сделать это, добавив эти две строки перед gsettings (строки разделяются точкой с запятой :) PID = $ (pgrep gnome-session); export DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environment | cut -d = -f2-);
Уилбрэдли
6

Введение

Этот ответ является редактированием исходного ответа. По мере продвижения в изучении Ubuntu и Linux, я обнаружил множество подходов и углубил свое понимание того, как установка фона работает в Ubuntu. Этот ответ - моя попытка как можно лучше задокументировать то, что я узнал до сих пор, и сделан в надежде, что этот материал может быть полезен для других.

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

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'

Настройка фона в Unity против голого рабочего стола 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. Для голого рабочего стола X вы можете использовать fehпрограмму. В частности, эта команда:

feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg

Там также GUI альтернатива , что nitrogen. fehИ nitrogenподходы могут быть использованы с другими , чем Unity настольных компьютеров, таких как openboxили blackbox. gsettingsПодход может быть использован с Unity или другим GNOME на основе рабочего стола.

Отключение команды gsettings

Что именно делает gsettingsкоманда? Ну, во-первых, существует база данных настроек dconf для каждого пользователя, которая предназначена для замены устаревшего GConf , и она доступна либо с помощью dconfкоманды, либо gsettings. В частности, здесь мы имеем дело со org.gnome.desktop.backgroundсхемой и одним из ее ключей picture-uri.

URI, что file:///home/JohnDoe/Pictures/cool_wallpaper.pngфактически означает Uniform Resource Identifier , который изначально был создан для использования в Интернете, но есть схема URI файла , которую мы видим здесь. Что хорошо в URI, так это то, что он дает путь в байтовом коде, если вы используете неанглийскую локаль, например, для моего китайского рабочего стола, у меня есть следующий URI для моего backgroun:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Написание сценариев с настройками

Конечно, каждый раз писать команду утомительно, и можно использовать немного магии сценариев. Например, вот что я установил в своем, ~/.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функции, которые были весьма полезны для других проектов , таких как Launcher Список индикаторов . В случае установки фона его также можно использовать, и я использовал его совсем недавно для этого вопроса . Вот упрощенная версия того же подхода:

#!/usr/bin/env python3
"""
Author: Serg Kolo , <1047481448@qq.com>
Date: December, 21,2016
Purpose: script for setting wallpaper, the pythonic way
Written for: https://askubuntu.com/q/66914/295286
"""
from gi.repository import Gio
import os,sys,random

def 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 со многими другими скриптами.

Сергей Колодяжный
источник
1

Благодаря удивительному ответу Серрано, я смог написать этот сценарий, который я использую как часть моих новых сценариев настройки машины для установки черного фона:

#! /bin/bash
SRC_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"
jerblack
источник
1

Также вы можете использовать это:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Александр
источник