Bash

腳本如何知道啟動它的 .desktop 文件的路徑?

  • August 8, 2015

腳本如何bash知道它是否已由.desktop文件啟動,以及它如何知道該啟動器的路徑?

加分:我將如何提取該文件的"comment"欄位.desktop- 以在腳本中使用?

環境變數GIO_LAUNCHED_DESKTOP_FILE包含文件的路徑.desktop,並GIO_LAUNCHED_DESKTOP_FILE_PID包含文件最初呼叫的程序的程序 ID .desktop。您需要檢查 PID,否則您可能會錯誤地認為腳本已被桌面文件呼叫,而實際上它是由由桌面文件呼叫的程序呼叫的程序呼叫的程序呼叫的。

if [ -n "$GIO_LAUNCHED_DESKTOP_FILE" ] && [ "$$" -eq "$GIO_LAUNCHED_DESKTOP_FILE_PID" ]; then
 echo "I was invoked by $GIO_LAUNCHED_DESKTOP_FILE"
else
 echo "I wasn't invoked by a .desktop file"
fi

這可能不適用於所有應用程序或所有環境,因為在引入文件時此環境變數不存在.desktop,它可能尚未在所有地方都受支持。Gnome 應用程序應該都可以工作,因為這項工作是在 Glib 庫中完成的。

請注意,如果桌面文件具有Terminal=true,則如果終端仿真器有一個執行所有實例的程序而不是每個實例一個程序,則可能最終不會設置環境變數。例如,這就是 Gnome-terminal 的工作方式。如果您明確地gnome-terminal …作為桌面文件中的命令執行,這同樣適用。每個終端執行一個程序的終端仿真器(例如 xterm)可以正常工作。

我不知道有任何 shell 工具可以解析桌面文件。您可以使用 grep、sed、awk 等普通工具,但您必須處理反斜杠轉義和每種語言條目(或選擇不支持它們)之類的事情。這是一個在簡單情況下提取註釋的腳本(沒有反斜杠,預設語言)。

if [ -n "$GIO_LAUNCHED_DESKTOP_FILE" ] && [ "$$" -eq "$GIO_LAUNCHED_DESKTOP_FILE_PID" ]; then
 comment=$(<"$GIO_LAUNCHED_DESKTOP_FILE" sed -n 's/^Comment=//p')
 if [ -n "$comment" ]; then
   echo "I was invoked by $GIO_LAUNCHED_DESKTOP_FILE with the following comment:"
   echo "$comment"
 else
   echo "I was invoked by $GIO_LAUNCHED_DESKTOP_FILE with no comment"
 fi
else
 echo "I wasn't invoked by a .desktop file"
fi

引用自:https://unix.stackexchange.com/questions/220924