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

Sha*_*ddi 76 command-line customization unity background

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

Ser*_*ira 97

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'
Run Code Online (Sandbox Code Playgroud)

并按如下方式设置背景 URI(这将立即更新您的桌面背景):

gsettings set org.gnome.desktop.background picture-uri file:///home/serrano/Pictures/y.jpg
Run Code Online (Sandbox Code Playgroud)

请注意,您必须在 URI 前面加上“file://”才能使其工作(与 不同gconftool)。

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

gnome-session --version
Run Code Online (Sandbox Code Playgroud)

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

  • @YumYumYum:除非您的系统中发生其他事情,否则上述命令会使您的系统崩溃是非常不寻常的。 (3认同)
  • 这对于当前登录的用户来说很好。我想知道如何以编程方式更改 _another_ 用户的壁纸!我确实尝试过 sudo --user=<username> gsettings ... 但这失败了。 (2认同)

Ind*_*dra 14

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

#!/bin/bash

DIR="/home/indra/Pictures/wallpapers"
PIC=$(ls $DIR/* | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"
Run Code Online (Sandbox Code Playgroud)

保存此脚本并使用命令“crontab -e”进行编辑(它会启动一个编辑器,您将这一行放在文件末尾):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 7

介绍

这个答案是对原始答案的编辑。随着我在 Ubuntu 和 Linux 研究中的进步,我发现了多种方法,并加深了我对在 Ubuntu 中设置背景如何工作的理解。这个答案是我尝试尽可能最好地记录迄今为止我所学到的知识,并且希望这些材料对其他人有用。

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

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
Run Code Online (Sandbox Code Playgroud)

在 Unity 和裸 X 桌面中设置背景

Unity 的工作方式是,下方是裸 X 桌面,上方是 Unity 的桌面窗口(实际上是 Nautilus 窗口的一个特殊实例,Ubuntu 的默认文件管理器)。因此,当你打电话

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
Run Code Online (Sandbox Code Playgroud)

为那个特殊的 Nautilus 窗口设置背景。当您禁用桌面图标时

gsettings set org.gnome.desktop.background show-desktop-icons false
Run Code Online (Sandbox Code Playgroud)

这将杀死 Nautilus 桌面并向您展示基本的 X 桌面。对于裸机 X 桌面,您可以使用feh程序。特别是,这个命令:

feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg
Run Code Online (Sandbox Code Playgroud)

还有一个 GUI 替代方案,nitrogen. 的fehnitrogen方法可以用比其他统一台式机,例如可以使用openboxblackbox。该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:'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 
} 
Run Code Online (Sandbox Code Playgroud)

可以使用绝对路径调用此函数,例如

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg
Run Code Online (Sandbox Code Playgroud)

或使用当前工作目录的相对路径

change_background Pictures/cool_wallpaper.jpg
Run Code Online (Sandbox Code Playgroud)

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

当然,这不是唯一的方法。Python 有一个用于 Gio 的 API(它是 背后的主要库gsettings)。我写了一个gsettings_getgsettings_set函数,它们对其他项目非常有用,比如Launcher List Indicator。在设置背景的情况下,它也可以使用,我最近刚刚用它来解决这个问题。这是相同方法的简化版本:

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
Run Code Online (Sandbox Code Playgroud)

当然,脚本的相同规则也适用于这里:确保它可以执行chmod +x set_wallpaper.py并将其存储在(最好) ~/bin文件夹中。用法很简单:./set_wallpaper.py Picture/cool_image.py 这个脚本的源代码也可以在我的GitHub存储库中找到,还有许多其他脚本。