Linux 转义要作为参数传递的系统变量,以使

Linux 转义要作为参数传递的系统变量,以使,linux,makefile,bakefile,Linux,Makefile,Bakefile,我有一个由bakefile生成的makefile,它工作正常。要运行可执行文件,它需要来自不同文件夹的库。我找到了用于指定这些库的路径的命令rpath。但是在使用命令时,我必须将它作为参数发送到makefile。 我不能直接从bakefile指定它 我可以使用LDFLAGS参数,这很好。我发现了如何使用$ORIGIN变量 我的问题是这种转义是如何工作的? make LDFLAGS=“-Wl,-rpath'-Wl,\$\$ORIGIN'” 单引号是否可以防止make解释变量? 为什么\$在这里两次

我有一个由bakefile生成的makefile,它工作正常。要运行可执行文件,它需要来自不同文件夹的库。我找到了用于指定这些库的路径的命令rpath。但是在使用命令时,我必须将它作为参数发送到makefile。 我不能直接从bakefile指定它

我可以使用LDFLAGS参数,这很好。我发现了如何使用$ORIGIN变量

我的问题是这种转义是如何工作的?

make LDFLAGS=“-Wl,-rpath'-Wl,\$\$ORIGIN'”

单引号是否可以防止make解释变量? 为什么\$在这里两次?

是的。真是一团糟

因此,在shell启动make命令之前,它将删除第一组引号。由于外部引号集是双引号,因此必须对
$
进行转义,否则shell会将其视为shell变量(与
echo“my path is$PWD”
之类的命令以及
PWD
变量的展开方式相比)。shell使用反斜杠引用
$
之类的内容

因此,当shell将命令行交给make时,它会看到设置
LDFLAGS=-Wl,-rpath'-Wl,$$ORIGIN'

makefile中的下一个将是带有如下命令的配方:

$(LD) $(LDFLAGS) ...
Make将如上所述展开
LDFLAGS
变量。对于make,任何前面带有
$
的名称都被视为make变量,您可以通过将
$
加倍(不像shell那样使用反斜杠)并写入
$
来避免make变量的扩展。Make将在扩展期间删除一个
$

因此,make将把
LDFLAGS
减少为字符串
-Wl,-rpath'-Wl,$ORIGIN'
,并将其传递给shell

shell将剥离下一级引号,在本例中为单引号。变量不会在单引号内展开,因此链接器实际上会得到参数,字面上是,
-Wl,-rpath
-Wl,$ORIGIN
,这就是您想要的