如果你混跡過ArchLinux的貼吧,應該會對各種狂拽炫酷吊炸天的桌面曬到飛起的景象感到震精!我也曾痴迷過配置各種widgets,dock,硬要配置的同樣狂拽炫酷然後滿足的發一貼。不過很快這種快感就會隨風遠去,自嗨過後剩下的是猶如老司機狂飆兩圈秋名山之後的寂寞,一如知乎上面的Arch黨,真是寂寞如雪啊。

配置那些花哨的widgets是無聊的,相信我。而且部分還有記憶體洩露的bug,導致你桌面越來越卡。另外,在桌面上擺放widget,總覺得挺彆扭,特別是如果我告訴你widget就是邊框透明掉的異形視窗,你會不會強迫症病發。一大堆沒有關閉且使用頻率不高的軟體視窗要擺在桌面上,那不是逼死強迫症嗎?

換一個思路,我們把widget的內容列印進桌面背景。

上一篇我們已經實現了從網路上自動下載桌面,那麼接下來讓我們對這張圖片“印上widget”吧,也好讓單調的桌布迸發生機!正如你們看到的,我打算把天氣和日期加進來。

在急於寫程式碼之前,分析一下可能碰到的技術難點。如何在圖片上面寫字?如何在圖片上面繪圖?如何獲取天氣日期資訊?

在圖片上面寫字繪圖,Linux有一個強大的批處理影象工具集合,大名鼎鼎的“imagemagick”。多數發行版都預裝了這個工具集。不妨拿我們下載的桌布試試手。

$>convert paper。jpg -resize 1920x -pointsize 60 -font Dejavu-Serif -draw “text 220,300 ‘hello world’” test。jpg

Shell指令碼實現自動從網路更換桌面背景(二)

Shell指令碼實現自動從網路更換桌面背景(二)

paper。jpg是源圖片,resize是修改解析度,1920寬,省略高(如果不省略高就是1920x1080,不過由於採用的是等比壓縮,你不太可能同時滿足高和寬,所以通常指定其一),pointsize為畫筆的尺寸,font為字型,draw開始繪製,draw的引數text代表文字,還可以是圖形比如rectangle,eclipse之類。接著,我們和繪製一個矩形,然後在上面寫上天氣和日期文字。

$>convert paper。jpg -resize 1980x -fill skyblue \

-pointsize 60 -font 文泉驛等寬正黑 \

-draw “fill-opacity 0。65 roundrectangle 180,150 650,550 10,10” \

-fill white -draw “text 200,220 ‘19℃ /晴’” \

-pointsize 40 -draw “text 220,300 ‘Fri March’” dest。jpg

Shell指令碼實現自動從網路更換桌面背景(二)

Shell指令碼實現自動從網路更換桌面背景(二)

我就先獻醜啦,我調了半天引數也就只能實現到這種地步啦。這裡新出現了幾個引數,比如fill填充顏色,然後draw了一個圓角矩形,引數分別是矩形左上點座標a(x,y),右下點座標b(x,y)以及圓角弧度f,f,另外這個矩形的fill-opacity代表透明度,取值0~1。

好!接下來的工作就是獲取天氣和日期了。先說日期,這個簡單,日期工具是date,如果你不熟悉它的用法,只需要記住它最常用的用法就是格式化輸出

$>date “+%format”

就可以了,具體有哪些format,可以直接man date一下(問男人)!在此我要取的日期是英文縮寫的weekday和全寫的月份用一個空格隔開。

$>date “+%a %B”

五 三月

結果是中文的,這特麼就尷尬了,這不就瞬間拉低逼格了嗎?強迫症表示不能忍。這是因為我們的Locale環境被設定成zh_CN。UTF-8了,我們可以看一下LC_ALL或者LANG環境變數值

$>echo LC_ALL=$LC_ALL LANG=$LANG

LC_ALL= LANG=zh_CN。UTF-8

也許你的情況與我略有區別,但如果你也出現了中文說明這兩個變數至少有一個是zh_CN。UTF-8。如果要顯示出英文,只需要改變成en_US。UTF-8就可以了,但是我又不想把整個終端的環境變數影響掉,只想單純的影響這一句,如何做?env命令就是解決這個場景的,env設定臨時環境變數,程式執行完畢,設定的一切變數就都消失了。

$>env LC_ALL=en_US。UTF-8 date “+%a %B”

Fri March

很強勢!

獲取天氣呢,為了簡單省事,直接爬百度“天氣”關鍵詞的搜尋頁 ,用上一篇文章介紹的方法,依舊是分析文字。

Shell指令碼實現自動從網路更換桌面背景(二)

Shell指令碼實現自動從網路更換桌面背景(二)

不難發現,我們需要的溫度和狀況對應的在class=“op_weather4_twoicon_shishi_title”的span標籤裡面和op_weather4_twoicon_shishi_sub的i標籤裡面。那麼利用上一篇文章演示過的手法,如法炮製一番……

先是溫度

$>curl -s www。baidu。com/s\?wd\=%E5%A4%A9%E6%B0%94 |\

grep -oP “twoicon_shishi_title\”>[^<]*?<“

op_weather4_twoicon_shishi_title”>10<

可以看到我們只需要那個“10”,所以再這個基礎上還得繼續過濾一次

$>curl -s www。baidu。com/s\?wd\=%E5%A4%A9%E6%B0%94 |\

grep -oP “twoicon_shishi_title\”>[^<]*?<“ |\

grep -oP ”\d+“

10

最後是獲取天氣狀態描述

$>curl -s www。baidu。com/s\?wd\=%E5%A4%A9%E6%B0%94 |\

grep -oP ”twoicon_shishi_sub\“>[^<]*?<” |\

grep -oE “>([^<])*\(”

>多雲(

這個“>多雲(”,前後各帶了我們用不著的字元,沒關係,一會在腳本里面可以擷取字串給處理掉。現在我們遇到的所有技術難題都得到了攻關,可以正式開始寫就程式碼了。仍然是編輯changewallpapaer。sh這個指令碼,再搞一個函式叫widgify好了。

function

widgify

{

local

weatherbody

=

`

curl -s www。baidu。com/s?wd

=

天氣

`

local

temp

=

$(

echo

$weatherbody

\

|

grep -oP

“twoicon_shishi_title\”>[^<]*?<“

\

|

grep -oP

”\d+“

local

status

=

$(

echo

$weatherbody

\

|

grep -oP

”twoicon_shishi_sub\“>[^<]*?<”

\

|

grep -oE

“>([^<])*\(”

local

status

=

${

status

1

:-

1

}

#擷取字串,從第1到倒數第1個位元組

debug

temp

=

$temp

status

=

$status

#開始合圖 如果你不知道自己計算機裡面有哪些字型

#使用convert -list font檢視並選擇一個字型

convert paper。jpg

\

-resize 1980x

\

-fill skyblue

\

-pointsize

60

\

-font 文泉驛等寬正黑

\

-draw

“fill-opacity 0。6 roundrectangle 180,150 650,550 10,10”

\

-fill white

\

-draw

“text 200,220 ‘

$temp

℃ /

$status

’”

\

-pointsize

40

\

-draw

“text 220,300 ‘`env LC_ALL=en_US。UTF-8 date ”

+%a %B

“`’”

dest。jpg

#把修改桌布的語句從downpaper函式挪過來!記住圖片名字換成合成圖dest而非papaer

pcmanfm -w

`

pwd

`

/dest。jpg

}

#最後修改main函式,新增widgify的呼叫!

downpaper

widgify

最後看看效果吧!

Shell指令碼實現自動從網路更換桌面背景(二)

Shell指令碼實現自動從網路更換桌面背景(二)

很強勢吧?!

本期程式碼已更新至我的github : nikoloss/linuxstuff