在 make 中使用 grep 检查文件是否包含对 PATH 的导出

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

我想要一个

make
函数来检查给定路径是否已经在我的
export
/
.bashrc
/等中
.zshrc
ed。文件。

因为你必须双重和三次转义(shell + make + regex),我陷入了困境。我目前的尝试:

define ensure_in_path
    @rg='export\s+PATH\s*=\s*\"\\$$PATH:${1}\"'; \
    if ! cat "${1}" | /bin/grep -q -E $$rg ; then \
        echo "added \"${2}\" to exports in \"${1}\".";\
    fi
endef

我想搭配这样的东西

export\s+=\s*\"?\$PATH:<the path here>\"
。 (这还算般配吗?)

示例:

$(call ensure_in_path,$$HOME/.bashrc,$$HOME/.local/bin)
应检查
export PATH="$PATH:/home/<username>/.local/bin"
是否在
/home/<username>/.bashrc
中,如果没有则将其附加到其中。

当然,在检查之前扩展

.bashrc
内部的路径当然会很好,但这是另一天的问题。

编辑1:

工作 bash 版本:

pth="$HOME/.local/bin"
rg="export\s+PATH\s*=\s*\"?\\\$PATH:${pth}\"?"
cat $HOME/.bashrc | grep -qE $rg

仍然无法使用 make 版本:

define ensure_in_path
    @rg="export\s+PATH\s*=\s\"?\\\\$$PATH:${2}\"?"; \
    echo $$rg;\
    if cat "${1}" | /bin/grep -qE $$rg ; then \
        echo "added path..."; \
    fi 
endef

它没有正确转义 $PATH。

regex makefile grep
1个回答
0
投票

嗯,上面显示的 makefile 中的版本与 shell 脚本中的版本完全不同。 我不确定您为什么决定进行额外的更改。 例如,您添加了一个额外的反斜杠。 但是使用双引号会让事情变得更加困难;使用 make 变量时不需要双引号,因为 make 只是扩展其变量,无论它们出现在哪里。

另外还要指出的是,在 shell 脚本中分配变量时在

=
周围放置空格是非法的。
VAR=foo
有效;
VAR = foo
是非法的。

如果这在 shell 脚本中有效:

grep -qE 'export\s+PATH="?$PATH:$HOME/.local/bin"?' < $HOME/.bashrc

那么对于 makefile 来说,这相当于(其中

$1
$HOME/.bashrc
并且
$2
包含
$HOME/.local/bin
)将是:

grep -qE 'export\s+PATH="?$$PATH:$2"?' < $1
© www.soinside.com 2019 - 2024. All rights reserved.