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

Скрипт ~/.profile выполняется при каждом входе в систему, вы можете поместить свой скрипт здесь.

Но имейте в виду, что если вы войдете в два разных виртуальных терминала, сценарий будет выполнен дважды.

1
задан 22 December 2016 в 01:43

4 ответа

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

#!/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
10
ответ дан 25 May 2018 в 18:08
  • 1
    Каталог обоев должен содержать только файлы обоев и никакой каталог. – loxaxs 26 January 2017 в 14:58
  • 2
    Однако gsettings не работает из cron. вам нужно установить переменную среды DBUS_SESSION_BUS_ADDRESS, чтобы работа gsettings работала. Вы можете сделать это, добавив эти две строки перед gsettings (строки разделяются точкой с запятой :) PID = $ (pgrep gnome-session); экспорт DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environ | cut -d = -f2-); – willbradley 13 January 2018 в 04:25

Введение

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

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

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

Настройка фона в Unity vs bare X desktop

Способ работы 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 можно использовать программу 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, фактически означает dconf , который первоначально был создан для использования в Интернете, но есть схема URI файла, что мы видим здесь. Что круто в URI, так это то, что он дает байтовый кодированный путь, если вы используете не-английский язык, например, с моим китайским рабочим столом, у меня есть следующий URI для моего backgroun: 'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Сценарии с настройками gsettings [ ! d15]

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

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

4
ответ дан 25 May 2018 в 18:08

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

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
1
ответ дан 25 May 2018 в 18:08

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

#! /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"
0
ответ дан 25 May 2018 в 18:08

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

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