我想要一个
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
内部的路径当然会很好,但这是另一天的问题。
工作 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。
嗯,上面显示的 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