如何传递 '$' => 特殊字符作为 makefile 的参数

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

我尝试传递 go scrip 中使用的 postgres 密码,该密码通过 makefile 传递 我的密码包含“$”字符=> makefile 无法识别它是一个字符。 我尝试使用转义字符 '$$' => 这也不起作用

pwsd:=$1

run:
    @echo "Password passed: ${pwsd}"
    @go run ./cmd/web ${pwsd}
input:
make run pwsd="passwd$"
output:
Password passed: passwd

input:
make run pwsd="passwd$$"
output:
Password passed: passwdpwsd=passwd$
expected:
Password passed: passwd$
shell go makefile arguments passwords
1个回答
0
投票

首先,在调试 makefile 时,您应该 never

@
前缀添加到您的配方中。 这就像运行编译器并将输出发送到
/dev/null

你必须首先了解

$
对于shell来说是特殊的:它引入了一个shell变量。 所以你必须首先从 shell 中逃脱
$
。 使用双引号并不能做到这一点:shell 变量在双引号内扩展:

foo=bar
echo "$foo"

显示

bar
,而不是
$foo
。 如果要确保包含
$
的字符串不会被 shell 扩展,则应使用单引号:

foo=bar
echo '$foo'

这将显示

$foo
。 因此,如果您希望 shell 看到包含美元符号的字符串,您需要 (a) 使用正确引用的值调用
make
,以及 (b) 在您的配方中使用正确的转义引号。 例如:

run:
        @echo 'Password passed: ${pwsd}'
        go run ./cmd/web '${pwsd}'

然后如果你运行

make pwsd='foo$bar'
,结果将是:

Password passed: foo$bar
go run ./cmd/web 'foo$bar'

我应该指出,如果您的密码可以包含单引号,这将会失败。 如果你想支持这一点,你就必须非常出色;像这样的东西:

quoted_pwsd = '$(subst ','"'"',$(pwsd))'
run:
        @echo Password passed: ${quoted_pwsd}
        go run ./cmd/web ${quoted_pwsd}

但是你必须小心使用它的地方。

© www.soinside.com 2019 - 2024. All rights reserved.