什麼是Desktop Entry呢?中文可以稱作「應用程式捷徑」,它是構成Linux桌面環境的基本元素之一,以.desktop
作為附檔名結尾。
很多Windows用戶有這種經驗吧,程式安裝後會自動在桌面建立捷徑,點一下就能夠啟動程式。刪掉捷徑,卻不會刪掉程式本體。Linux也有類似的東西,那就是Desktop Entry。
基本上,只要你有使用Linux桌面,每天都會看到各式各樣的Desktop Entry圖示。
大部分的Linux桌面環境都遵守Freedesktop.org制定的Desktop Entry標準,使之能顯示在桌面上與使用者互動。
下文Ivon簡介Desktop Entry的用途,還有基本格式,搭配實例解說。
1. 為什麼需要Desktop Entry?#
試想一下,你在桌面點一下啟動Firefox圖示,就會開啟Firefox瀏覽器。而實際上你是透過位於/usr/share/applications/firefox.desktop
的檔案,間接啟動背後的二進位檔/usr/bin/firefox
的。
為什麼我們不要直接執行程式的二進位檔就好了?通常Linux套件管理器安裝軟體的時候,會將二進位檔放到系統目錄,隨之安裝的還有Desktop Entry。接著桌面的應用程式列表/選單便會顯示該應用程式的圖示。
Desktop Entry並非應用程式本體,它比較像是一個啟動器,裡面定義了啟動應用程式的參數、桌面圖示、右鍵選單、多語言名稱的資訊。透過Desktop Entry,使用者能夠更直覺的啟動軟體,而不用頻繁使用指令。
如果把透過Desktop Entry啟動程式的過程繪製為圖片,那麼內容應該是長這樣的:
要是沒有Desktop Entry,使用者啟動程式可能就得這樣做:
我們不是原始人!
Desktop Entry的標準,也能改善桌面環境彼此之間的互通性,以下內容摘自Freedesktop.org官網:
KDE Plasma 和 GNOME 桌面環境都採用了類似的格式來處理「桌面項目」,即用於描述特定程式如何啟動、如何在選單中顯示等的配置文件。為了更廣泛的社群利益,各方應達成統一標準,這樣不僅可以簡化這兩個環境之間的互通性,還能讓任何實施該規範的額外環境更容易相容。
基本上GNOME和KDE Plasma都遵守Freedesktop.org提出的Deskop Entry標準,規定一個.desktop檔案裡面要有哪些項目。不過也有自家另外定義的標準,這端看應用程式開發者要不要支援了。
XFCE、Cinnamon、LXQT等其他桌面理應也遵守Desktop Entry標準。
2. Desktop Entry會用在什麼地方?#
- 幾乎每個圖形化程式都會在套件安裝後自動建立Desktop Entry,讓使用者可以點選圖示啟動。
例如GNOME的應用程式列表,上面的圖示全都是Desktop Entry。
還有KDE Plasma的應用程式列表,會依照Desktop Entry檔案定義的應用程式類別進行分類。
當然,使用者也可以自己新增Desktop Entry,啟動特定的二進位檔(binary)或者指令稿(script)。
允許使用者傳遞不同的參數,修改應用程式啟動後的行為。譬如,向Firefox傳遞
-P "profile_name"
參數,可以用不同的設定檔啟動Firefox。將Desktop Entry放到桌面的話,即為新增桌面捷徑。雖然Desktop Entry有捷徑的功用,但它跟ln指令還是不一樣的東西。
修改開啟特定檔案格式的預設程式,參見XDG MIME Applications。不需要寫死應用程式的二進位檔路徑,而是透過
xdg-open
指令,執行Desktop Entry,用特定的應用程式開啟檔案。Desktop Entry也能夠定義該程式能用來開啟哪些格式的檔案。讓程式開機自動啟動,參見XDG Autostart。Desktop Entry比較適合用來啟動圖形化程式,純文字執行的建議用Systemd。
3. Desktop Entry有效路徑#
雖然Desktop Entry可以單獨存在,想放在哪個路徑都可以,但是若要顯示在桌面環境,就必須放到指定位置。
認識「有效路徑」的概念,放到這裡的Desktop Entry,才會被桌面環境讀取到,並顯示在應用程式列表。
就以Ubuntu系統來說,Desktop Entry可能的目錄有以下幾個,才能夠顯示在桌面的應用程式列表:
/usr/share/applications
→ 系統套件管理員安裝的程式/usr/local/share/applications
→ 使用者自行安裝到系統目錄的程式~/.local/share/applications
→ 使用者安裝到自身家目錄的程式/var/lib/flatpak/exports/share/applications
→ Flatpak套件~/.local/share/flatpak/exports/share/applications
→ Flatpak套件/var/lib/snapd/desktop/applications
→ Snap套件
常用的是前三個。
4. Desktop Entry寫法,以自訂Firefox為例#
Deskop Entry規定了應用程式的啟動方式。通常套件管理器安裝軟體的時候會一併建立Desktop Entry。例如執行apt install firefox
,從.deb檔解出二進位檔放到/usr/bin/firefox
,並將Desktop Entry放到/usr/share/applications/firefox.desktop
。然後桌面的應用程式列表就會顯示Firefox。
正如我上面說的,使用者可以編輯現有的Desktop Entry,或者新創一個。老實說,編輯現有的Desktop Entry不是很建議的作法,因為很容易跟著系統更新而被套件管理器覆蓋掉。比較好的方法是複製一份,或者從頭寫一個Desktop Entry。
比如,我想要建立一個啟動Fifrefox後以personal
設定檔啟動的Desktop Entry,那麼我就得先複製一個Desktop Entry,接著修改內容。
執行
firefox -P
指令,新增一個叫做personal的Firefox設定檔。將Firefox的Desktop Entry複製到使用者目錄,建立一個
firefox-custom.desktop
檔案。我這裡複製到~/.local/share/applications/
是要讓它能夠顯示在桌面的應用程式列表。你也可以把它複製到~/Desktop
,只顯示在桌面。
cp /usr/share/applications/firefox.desktop \
~/.local/share/applications/firefox-custom.desktop
- 編輯
firefox-custom.desktop
裡面的內容。
vim ~/.local/share/applications/firefox-custom.desktop
- 如何修改Desktop Entry呢?實際上Freedesktop.org定義的可以用的選項很多,講幾個比較重要的。下表標示「必要」的項目表示Deskop Entry必須含有該鍵值。
鍵 | 用途 | 必要 |
---|---|---|
Version | Deskp Entry標準的版本,不是應用程式版本。雖然不是必要項目,但還是建議註明 | 否 |
Type | 決定這個是應用程式(Application)、網頁連結(Link)還是目錄(Directory)。本文只討論Application的用法 | 是 |
Name | 顯示的應用程式名稱。後面加上[語言代碼] 用於支援多語言顯示,沒有的話就是顯示預設語言的名稱 | 是 |
GenericName | 通用應用程式名稱,GNOME不會顯示此資訊,但KDE Plasma會在應用程式名稱下方顯示。後面加上[語言代碼] 用於支援多語言顯示,沒有的話就是顯示預設語言的名稱。 | 否 |
Keywords | 關鍵字,便於使用者搜尋。後面加上[語言代碼] 用於支援多語言顯示 | 否 |
Exec | 要執行的程式指令,通常是寫出二進位檔或者指令稿的絕對路徑,因為你沒辦法保證每個發行版的$PATH 都一樣 | 否 |
Path | 程式工作目錄 | 否 |
Terminal | 是否在終端機裡面執行程式 | 否 |
NoDisplay | 是否要從應用程式列表隱藏。 | 否 |
Comment | 註解。即滑鼠移到應用程式圖示上會短暫顯示的工具提示框。 | 否 |
Icon | 圖示路徑,遵守Icon Theme標準,也可以直接寫路徑。 | 否 |
Actions | 可執行的操作,也就是使用者在桌面對應用程式圖示按右鍵會顯示的選單。先用Actions= 宣告有哪些操作,再透過[Desktop Action 動作名稱] 區塊的方式來定義操作背後執行的指令。 | 否 |
MimeType | 表示應用程式能開啟哪些檔案格式 | 否 |
Categories | 應用程式分類,GNOME不會顯示,KDE Plasma會自動分類到不同選單下面。 | 否 |
StartupWMClass | 啟動的視窗類別 | 否 |
StartupNotify | 啟動時是否顯示通知 | 否 |
#
開頭的行數是註解。
[ ]
包起來的是一個區塊。
所有的鍵值用Key=Value
的方式表示。
如果要設定環境變數,使用env
,譬如Exec=env MOZ_ENABLE_WAYLAND=1 firefox %u
- 檢視
/usr/share/applications/firefox.desktop
,Firefox的Desktop Entry就符合了上面所說的內容。
[Desktop Entry] # 這一個區塊是Desktop Entry的基本資訊
Version=1.0
Type=Application # 應用程式
Exec=firefox %u # 點選後會執行的指令
Terminal=false # 不要開啟終端機
Icon=firefox # 圖示
StartupWMClass=firefox # 啟動的視窗類別
Categories=GNOME;GTK;Network;WebBrowser; # 應用程式分類
MimeType=application/json;application/pdf;application/rdf+xml;application/rss+xml;application/x-xpinstall;application/xhtml+xml;application/xml;audio/flac;audio/ogg;audio/webm;image/avif;image/gif;image/jpeg;image/png;image/svg+xml;image/webp;text/html;text/xml;video/ogg;video/webm;x-scheme-handler/chrome;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/mailto; # Firefox可以用來開啟的檔案格式
StartupNotify=true # 啟動時顯示通知
Actions=new-window;new-private-window;open-profile-manager; # 右鍵操作,下面才寫出具體執行指令
Name=Firefox # 多語言應用程式名稱
Name[zh_CN]=Firefox
Name[zh_TW]=Firefox
Comment=Browse the World Wide Web # 滑鼠移到圖示上短暫顯示的工具提示框
Comment[zh_CN]=浏览万维网
Comment[zh_TW]=瀏覽全球資訊網
GenericName=Web Browser
GenericName[zh_CN]=Web 浏览器
GenericName[zh_TW]=網頁瀏覽器
Keywords=Internet;WWW;Browser;Web;Explorer; # 搜尋關鍵字
Keywords[zh_CN]=Internet;WWW;Browser;Web;Explorer;
Keywords[zh_TW]=網際網路;網路;瀏覽器;網頁;上網;Internet;WWW;Browser;Web;Explorer;
[Desktop Action new-window] # 按右鍵會顯示的操作
Exec=firefox --new-window %u
Name=New Window
Name[zh_CN]=新建窗口
Name[zh_TW]=開新視窗
[Desktop Action new-private-window] # 按右鍵會顯示的操作
Exec=firefox --private-window %u
Name=New Private Window
Name[zh_CN]=新建隐私窗口
Name[zh_TW]=開新隱私視窗
[Desktop Action open-profile-manager] # 按右鍵會顯示的操作
Exec=firefox --ProfileManager
Name=Open Profile Manager
Name[zh_CN]=打开配置文件管理器
Name[zh_TW]=開啟設定檔管理員
- 那要從何改起呢?觀察一下得知,只要修改
Name=
和Exec=
的內容,就夠做出一個自訂啟動器了。考慮到這只是一個簡單的捷徑,所以我將fireofx-custom.desktop
其他的鍵值全部省略,精簡成如下內容。
[Desktop Entry]
Version=1.0
Type=Application
Name=Firefox 以Personal設定檔啟動
Categories=GNOME;GTK;Network;WebBrowser;
Exec=firefox -P "personal"
Icon=firefox
- 嘗試重新登入桌面,便會在應用程式列表看到兩個Firefox了。