如何使用 sed inline 正确地将 ~ 替换为 $HOME?

问题描述 投票:0回答:1

想法是把这个 ~/.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
bash sed makefile
1个回答
2
投票

由于您自己的代码正在生成包含波浪号的伪路径,我想您可以对表格充满信心。这很重要,因为通常情况下,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
© www.soinside.com 2019 - 2024. All rights reserved.