Làm cách nào để thay đổi nền màn hình từ dòng lệnh trong Unity?


63

Tôi có một kịch bản cập nhật nền máy tính để bàn của tôi mỗi ngày với APOD của NASA. Kể từ khi nâng cấp lên 11.10, tập lệnh đó đã ngừng hoạt động, có lẽ vì tôi đang sử dụng gconftool-2để thực sự cập nhật nền màn hình. Có một cách mới để làm điều này theo Unity?

Câu trả lời:


82

Cả Unity và Gnome Shell (Gnome 3) đều sử dụng GSinstall ngay bây giờ thay vì GConf. Vì vậy, trong Unity và Gnome Shell, bạn có thể sử dụng công cụ dòng lệnh gsettingscho việc đó. Giống như gconftool, nó cho phép bạn nhận hoặc đặt một khóa riêng lẻ.

Bạn có thể lấy URI hiện tại của ảnh nền như sau:

gsettings get org.gnome.desktop.background picture-uri
'file:///home/serrano/Pictures/x.jpg'

Và đặt URI nền như sau (sẽ cập nhật ngay nền màn hình của bạn):

gsettings set org.gnome.desktop.background picture-uri file:///home/serrano/Pictures/y.jpg

Lưu ý rằng bạn phải thêm URI bằng "file: //" để nó hoạt động (không giống như gconftool).

Để làm cho tập lệnh của bạn hoạt động với cả Gnome 2 và Shell / Unity, bạn có thể để nó thực hiện kiểm tra phiên bản Gnome trước:

gnome-session --version

Điều đó sẽ trả về phiên bản của Gnome. Nếu số phiên bản bắt đầu bằng 3, thì gsettingscó thể được sử dụng. Nếu nó trả về một phiên bản bắt đầu bằng 2, hãy để tập lệnh của bạn sử dụng gconftoolthay thế.


Tôi đã sử dụng lệnh này trong Ubuntu 12.04 và hệ thống bị sập
YumYumYum

2
@YumYumYum: Điều rất bất thường là các lệnh trên sẽ làm sập hệ thống của bạn, trừ khi có điều gì khác xảy ra trong hệ thống của bạn.
Serrano

Bạn có thể thêm Cinnamon vào danh sách Môi trường máy tính để bàn bằng cách sử dụng gsinstall;)
MrVaykadji

Lưu ý rằng bạn phải thêm URI bằng "file: //" để làm việc này (không giống với gconftool). <- Điều này rất quan trọng! Tôi đã không tìm thấy điều này được đề cập rõ ràng ở bất cứ nơi nào khác.
Tom

2
Điều này tốt cho người dùng hiện tại đã đăng nhập. Tôi muốn biết cách thay đổi hình nền của người dùng khác theo chương trình ! Tôi đã thử sudo --user = <tên người dùng> gsinstall ... nhưng không thành công.
kaiwan

12

Mã này thay đổi ngẫu nhiên hình nền từ một thư mục nhất định.

#!/bin/bash

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

Lưu tập lệnh này và chỉnh sửa tập lệnh của bạn bằng lệnh "crontab -e" (nó khởi chạy trình chỉnh sửa nơi bạn đặt dòng này ở cuối tệp):

*/1     *     *     *     *         /bin/bash /path/to/script.sh

1
Thư mục hình nền phải chỉ chứa các tập tin hình nền và không có thư mục.
loxaxs

gsinstall sẽ không hoạt động từ cron, tuy nhiên. bạn cần đặt biến môi trường DBUS_SESSION_BUS_ADDRESS để gs settings hoạt động. Bạn có thể làm điều đó bằng cách thêm hai dòng này trước gsinstall (các dòng được phân tách bằng dấu chấm phẩy :) PID = $ (pgrep gnome-session); xuất DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / Proc / $ PID / môi trường | cut -d = -f2-);
willbradley

6

Giới thiệu

Câu trả lời này là một chỉnh sửa của câu trả lời ban đầu. Khi tôi đã tiến bộ trong các nghiên cứu về Ubuntu và Linux của mình, tôi đã khám phá ra nhiều cách tiếp cận khác nhau và hiểu sâu hơn về cách thiết lập nền hoạt động trong Ubuntu. Câu trả lời này là nỗ lực của tôi để ghi lại tốt nhất có thể những gì tôi đã học được cho đến nay và được thực hiện với hy vọng rằng tài liệu này có thể hữu ích cho những người khác.

Phần quan trọng là để đặt nền cho máy tính để bàn Unity từ dòng lệnh, bạn có thể sử dụng

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

Đặt nền trong máy tính để bàn Unity vs Bare X

Cách thức hoạt động của Unity là có máy tính để bàn X bên dưới và bên trên là cửa sổ máy tính để bàn của Unity (thực tế là một phiên bản đặc biệt của cửa sổ Nautilus, trình quản lý tệp mặc định của Ubuntu). Vì vậy, khi bạn gọi

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

đặt nền cho cửa sổ Nautilus đặc biệt đó. Khi bạn tắt biểu tượng máy tính để bàn với

gsettings set org.gnome.desktop.background show-desktop-icons false

điều đó sẽ giết chết máy tính để bàn Nautilus và cho bạn thấy máy tính để bàn X xương trần. Đối với máy tính để bàn X xương trần, bạn có thể sử dụng fehchương trình. Đặc biệt, lệnh này:

feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg

Ngoài ra còn có GUI thay thế cho điều đó , nitrogen. Các phương pháp fehnitrogencách tiếp cận có thể được sử dụng với các máy tính để bàn khác với Unity, chẳng hạn như openboxhoặc blackbox. Cách gsettingstiếp cận có thể được sử dụng với Unity hoặc máy tính để bàn dựa trên Gnome khác.

Loại bỏ lệnh gsinstall

Chính xác thì gsettingslệnh làm gì? Chà, trước hết, tồn tại cơ sở dữ liệu cài đặt dcs cho mỗi người dùng, được dùng để thay thế cho GConf không dùng nữa và có thể truy cập thông qua dconflệnh hoặc gsettings. Cụ thể, chúng tôi đang xử lý ở đây với org.gnome.desktop.backgroundlược đồ và một trong các khóa của nó , picture-uri.

URI, file:///home/JohnDoe/Pictures/cool_wallpaper.pngthực ra là viết tắt của Mã định danh tài nguyên đồng nhất , ban đầu được tạo để sử dụng internet, nhưng có đồ URI tệp , đó là những gì chúng ta thấy ở đây. Điều thú vị về URI là nó cung cấp đường dẫn được mã hóa byte nếu bạn sử dụng ngôn ngữ không phải tiếng Anh, ví dụ với máy tính để bàn Trung Quốc của tôi, tôi đã theo dõi URI cho backgroun của mình:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Viết kịch bản với gsinstall

Tất nhiên, viết ra lệnh mỗi lần là tẻ nhạt và người ta có thể sử dụng một chút phép thuật kịch bản. Chẳng hạn, đây là những gì tôi đã thiết lập ~/.bashrcđể tôi có thể thay đổi nền theo ý muốn:

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 
} 

Hàm này có thể được gọi với đường dẫn tuyệt đối như

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

hoặc với đường dẫn tương đối từ thư mục làm việc hiện tại

change_background Pictures/cool_wallpaper.jpg

Nó cũng thực hiện kiểm tra nếu tập tin tồn tại và giải quyết các liên kết tượng trưng. Điều này có thể được sử dụng trong một tập lệnh shell hoặc là chức năng độc lập để sử dụng hàng ngày.

Tất nhiên, đây không phải là cách duy nhất. Python có API cho Gio (là thư viện chính phía sau gsettings). Tôi đã viết một gsettings_getvà các gsettings_setchức năng, khá hữu ích cho các dự án khác, chẳng hạn như Chỉ báo danh sách trình khởi chạy . Trong trường hợp đặt nền, nó cũng có thể được sử dụng và tôi mới sử dụng nó cho câu hỏi này . Đây là một phiên bản đơn giản hóa của cách tiếp cận tương tự:

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

Tất nhiên, các quy tắc tương tự cho các tập lệnh cũng được áp dụng ở đây: đảm bảo nó được thực thi cùng chmod +x set_wallpaper.pyvà lưu trữ nó trong ~/binthư mục (ưu tiên) . Cách sử dụng rất đơn giản: ./set_wallpaper.py Picture/cool_image.py Mã nguồn của tập lệnh này cũng có sẵn trên kho GitHub của tôi với nhiều tập lệnh khác.


1

Nhờ câu trả lời tuyệt vời của Serrano, tôi đã có thể viết tập lệnh này mà tôi sử dụng như một phần của tập lệnh thiết lập máy mới để đặt nền đen:

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

Ngoài ra, bạn có thể sử dụng này:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.