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

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

76
задан 22 December 2016 в 00:43

5 ответов

Как "Единство", так и "Гном Шелл" (Гном 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 вместо этого.

96
ответ дан 22 December 2016 в 00:43

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

#!/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
14
ответ дан 22 December 2016 в 00:43

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

#! /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"
1
ответ дан 22 December 2016 в 00:43

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

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
1
ответ дан 22 December 2016 в 00:43

Введение

Этот ответ является редакцией исходного ответа. По мере того, как я продвигался в своих исследованиях 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

Есть также альтернатива этому графическому интерфейсу, азот . Подходы feh и азота могут использоваться с рабочими столами, отличными от Unity, такими как openbox или blackbox . Подход gsettings можно использовать с Unity или другим рабочим столом на базе GNOME.

Разделение команды gsettings

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

URI, этот файл: /// home / JohnDoe / Pictures / cool_wallpaper.png , фактически означает Uniform Resource Identifier , который изначально был создан для использования в Интернете, но есть схема URI файла , которую мы видим здесь. Что круто в URI, так это то, что он дает путь в байтовой кодировке, если вы используете не английский язык, например, с моим китайским рабочим столом, у меня есть следующий URI для моего фона: '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,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 вместе со многими другими скриптами.

7
ответ дан 22 December 2016 в 00:43

Другие вопросы по тегам:

Похожие вопросы: