Quoting

如何在包含保留字元的 .desktop 文件中正確編寫 Exec 鍵的命令?

  • December 21, 2014

我正在嘗試為 Minecraft 創建一個 .desktop 文件。執行文件時似乎沒有任何反應。我嘗試按如下方式分配 Exec 鍵:

Exec= java -jar "~/.minecraft/Minecraft.jar"

Exec= java -jar "$HOME/.minecraft/Minecraft.jar"

但我不確定如何正確輸入保留字元(~ 和 $)。根據 Freedesktop 的桌麵條目規範

如果參數包含保留字元,則必須引用該參數。

引用必須通過將參數括在雙引號之間並在雙引號字元、反引號字元 ("`")、美元符號 ("$") 和反斜杠字元 ("") 前加上一個額外的反斜杠字元來轉義。實現必須在擴展域程式碼和將參數傳遞給可執行程序之前撤消引用。

但這讓我很困惑。

這似乎是一種常見的解決方法sh,它將正確解析特殊符號和變數:

Exec=sh -c "java -jar ~/.minecraft/Minecraft.jar"

在您的 .desktop 文件中寫入:

Exec=sh -c 'java -jar "$HOME"/.minecraft/Minecraft.jar'

樣本 2:

Exec=sh -c "u=%u; k=%k; c=%c;"' kd="$k"; [ -f "$kd" ] && kd=`dirname "$k"`; cd "$kd"; uxterm -bg blue -fg cyan3 -fn 9x15'

解釋:

  • 所有術語,如雙引號、引號、元字元(如 $ 和 ~)總是與 shell 相關 - shell(命令解釋器,如 bash 或 dash)(順便說一句)獨立於任何終端(如 xterm)。
  • 當您希望將波浪號或 shell-var $HOME 擴展為某事時。像 /home/myloginname 這只能由 /bin/bash 或 /bin/sh (==/bin/dash) 完成。
  • xdg-desktop-interpreter 的 Exec-line 需要一個真實的程序(path-to-a-bin-file)並且永遠不會直接擴展任何 shell-stuff,而是通過為 sh-command 提供選項 -c ‘command-string ; 命令… ; cmd …‘一切都應該正常工作。
  • %u 是一個“xdg-placeholder”,並獨立更改為 DnD-URL(在執行 shell-command-line 之前)
  • 請注意,您可以使用 # … 註釋掉 .desktop 文件中的行

PS:

! case   coproc   do  done elif else esac fi for function if in select
then until while { } time [[ ]]

都是“保留字”(不要將其與 shell 的內置命令混淆),但是 ~ 和 $ are meta-chars (the tilde must be un-quoted to be expanded, while $ MYVAR 可能會被引用,如果它在路徑中包含空格)

親切的問候 EOF

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