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

我有一个脚本,每天用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 (与gconftool不同)。

为了使您的脚本适用于Gnome 2和Shell / Unity,您可以先让它进行Gnome版本检查:

 gnome-session --version 

这将返回Gnome的版本。 如果版本号以3开头,则可以使用gsettings 。 如果它返回以2开头的版本,请让您的脚本改为使用gconftool

此代码随机更改给定目录中的壁纸。

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

介绍

这个答案是对原始答案的编辑。 随着我在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替代nitrogenfehnitrogen方法可以用于Unity以外的桌面,例如openboxblackboxgsettings方法可以与Unity或其他基于GNOME的桌面一起使用。

禁止gsettings命令

gsettings命令到底做了什么? 嗯,首先,每个用户都有dconf数据库设置,用于替换已弃用的GConf ,可以通过dconf命令或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脚本中使用,也可以作为日常使用的独立function使用。

当然,这不是唯一的方法。 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\'ta 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'" 

感谢Serrano的精彩回答,我能够编写这个脚本,我将其作为新机器设置脚本的一部分来设置黑色背景:

 #! /bin/bash SRC_URI="http://ubuntu.miximages.com/command-line/uomkVIL.png" FNAME="/home/$USER/Pictures/black.png" wget "$SRC_URI" -O "$FNAME" gsettings set org.gnome.desktop.background picture-uri "$FNAME"