脚本如何bash
知道它是否已由文件启动.desktop
,以及如何知道该启动器的路径?
额外要点:我如何提取"comment"
该.desktop
文件的字段 - 以在脚本中使用?
答案1
环境变量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 终端的工作原理。如果您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