gpt4 book ai didi

shell - Makefile shell 调用中的哈希会导致意外行为

转载 作者:行者123 更新时间:2023-12-03 16:07:07 26 4
gpt4 key购买 nike

以下命令根据 g++ 认为的位置打印特定 C++ header 的绝对路径。

echo \#include\<ham/hamsterdb.h\> | g++ -M -x c++-header - | grep hamsterdb.hpp | sed -e 's/-:  //' -e 's/ \\//'

在我的系统上,这输出: /usr/local/include/ham/hamsterdb.hpp
尝试在 Makefile 中运行它以设置变量时遇到问题:
FILE=$(shell echo \#include\<ham/hamsterdb.h\> | g++ -M -x c++-header - | grep hamsterdb.hpp | sed -e 's/-:  //' -e 's/ \\//')

.PHONY spec

spec:
@echo $(FILE)

这将输出一个新行。我认为这是混淆 make 的哈希('#')字符;如果我重写 FILE=...像这样的行:
FILE=$(shell echo \#include\<ham/hamsterdb.h\>)

输出仍然是什么。

最佳答案

为了在函数内部使用它,你必须两次转义哈希值:一次用于 Make,一次用于 shell。

那是,

FILE = $(shell echo \\\#include\ \<ham/hamsterdb.h\>)

请注意三个反斜杠,而不是人们预期的两个。需要第三个反斜杠,否则第一个反斜杠会转义第二个,而散列仍然未转义。

更新。

另一种可能的解决方案是只对 Make 的哈希进行转义,并使用 Bash 单引号来防止将哈希解释为 shell 注释。这也消除了转义空格的需要, <> :
FILE = $(shell echo '\#include <ham/hamsterdb.h>')

关于shell - Makefile shell 调用中的哈希会导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9052220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com