如何在Unity中从命令行更改桌面背景?


63

我有一个脚本,每天都会使用NASA APOD更新我的桌面背景。自从升级到11.10以来,该脚本已停止工作,大概是因为我gconftool-2实际上是在更新桌面背景。在Unity下是否有新的方法可以做到这一点?

Answers:


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


我在Ubuntu 12.04中使用了此命令,系统崩溃了
YumYumYum 2013年

2
@YumYumYum:上面的命令会使系统崩溃,这是非常不寻常的,除非系统中发生了其他事情。
塞拉诺

您可以使用gsettings将Cinnamon添加到桌面环境列表中;)
MrVaykadji 2014年

请注意,您必须在URI前面加上“ file://”才能使其正常工作(与gconftool不同)。<-这很重要!我没有在其他任何地方明确提及此问题。
2014年

2
这对于当前登录的用户来说很好。我想知道如何以编程方式更改另一个用户的墙纸!我确实尝试了sudo --user = <用户名> gsettings ...但是失败了。
凯文2014年

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
wallpaper目录必须仅包含墙纸文件,而不能包含目录。
loxaxs

但是,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-);
willbradley18年

6

介绍

该答案是原始答案的编辑。随着我在Ubuntu和Linux研究方面的不断进步,我发现了各种方法,并且加深了我对在Ubuntu中设置背景的工作方式的理解。这个答案是我试图尽可能地记录我到目前为止所学的知识,并且希望此材料对其他人有用。

重要的是要从命令行设置Unity桌面的背景,您可以使用

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

在Unity vs裸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。的fehnitrogen方法可以用比其他统一台式机,例如可以使用openboxblackbox。该gsettings方法可以与Unity或其他基于GNOME的桌面一起使用。

剖析gsettings命令

gsettings命令究竟是做什么的?好吧,首先,每个用户都有一个dconf设置数据库,用于替换已弃用的GConf,可以通过dconfcommand或来访问它gsettings。特别是,我们在这里处理 org.gnome.desktop.background模式及其键之一picture-uri

URI file:///home/JohnDoe/Pictures/cool_wallpaper.png实际上代表统一资源标识符,它最初是为互联网使用而创建的,但是这里有文件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

它还会检查文件是否存在并解析符号链接。可以在shell脚本中使用,也可以作为日常使用的独立功能使用。

当然,这不是唯一的方法。Python具有适用于Gio的API(这是背后的主库gsettings)。我已经编写了gsettings_getgsettings_set函数,对于其他项目(例如Launcher List Indicator)非常有用。如果设置背景,也可以使用它,而我刚刚在此问题上使用了它。这是该方法的简化版本:

#!/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

感谢Serrano的出色回答,我得以编写此脚本,并将其用作新机器设置脚本的一部分来设置黑色背景:

#! /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

您也可以使用此:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.