想法是把这个 ~/.local/bin 改成这个 /home/user1/.local/bin
所以我有一个 Makefile 基本上试图让它工作但它没有
system:
sed -i 's/~/$HOME/g' myapp.desktop
[Desktop Entry]
Version=0.4
Type=Application
Name=Desktop App
Exec=~/.local/bin/desktop_app
Terminal=false
由于您自己的代码正在生成包含波浪号的伪路径,我想您可以对表格充满信心。这很重要,因为通常情况下,shell 的波浪号扩展 行为与您要执行的简单翻译并不完全一致。 shell 的波浪号扩展至少在这些方面有所不同:
/
),如果有的话一个简单的替换,例如您的示例
sed
命令建议将与 shell 的波浪号扩展对某些可能的输入具有相同的效果,但对其他输入具有不同的效果,因此再次强调,控制输入的形式很重要。
对于您的特定情况,您似乎希望外壳扩展
$HOME
,但单引号会抑制它。另一方面,您需要 make
来 not 扩展 $H
(可能什么都没有),因此您需要从 $
中逃脱 make
。生成的规则可能如下所示:
system:
sed -i "s/~/$${HOME}/g" myapp.desktop
但是,还有其他问题,例如
-i
选项不可移植。有些 sed
根本没有它,并且在那些有它的人之间行为会有所不同(例如,BSD 风格 sed
vs GNU sed
)。
由于您是通过代码生成器生成此桌面文件,因此首先想到的问题是为什么您不首先使用所需的
Exec
路径生成它?
对我来说唯一有意义的答案是您在与安装软件的上下文不同的上下文中生成桌面文件。然而,在那种情况下,下一个问题是为什么你不利用标准工具来处理桌面文件?特别是,使用
desktop-file-install
将文件安装到用户的.local/share/applications
、和,同时设置Exec
键的正确值。例子:
INSTALL_BIN = "$${HOME}"/.local/bin
INSTALL_DESKTOP = "$${HOME}"/.local/share/applications
install:
mkdir -p $(INSTALL_BIN)
mkdir -p $(INSTALL_DESKTOP)
install -m 0755 desktop-app $(INSTALL_BIN)
desktop-file-install --dir=$(INSTALL_DESKTOP) --set-key=Exec --set-value=$(INSTALL_BIN)/desktop-app