Я пытался передать пароль для postgres, который используется в сценарии go и передается через make-файл. Мой пароль содержит символ '$' => make-файл не распознает его как символ. Я пробовал использовать escape-символ '$$' => это тоже не работает
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$
Также обратите внимание, что pwsd:=$1 почти наверняка не делает того, что вы думаете.
Вам необходимо подавить расширение параметров. Отсюда make run 'pwsd=passwd$$' или make run pwsd=passwd\$\$, в зависимости от ваших стилистических предпочтений.
@user1934428 => Спасибо, чувак, это сработало.





Во-первых, при отладке make-файлов никогда не следует добавлять к рецепту префикс @. Это похоже на запуск вашего компилятора с отправкой вывода в /dev/null.
Сначала вы должны понять, что $ является особенным для оболочки: он вводит переменную оболочки. Таким образом, вам нужно в первую очередь избежать $ из оболочки. Использование двойных кавычек этого не дает: переменные оболочки заключаются в двойные кавычки:
foo=bar
echo "$foo"
показывает bar, а не $foo. Если вы хотите гарантировать, что строка, содержащая $, не будет расширена оболочкой, вам следует использовать одинарные кавычки:
foo=bar
echo '$foo'
Это покажет $foo. Поэтому, если вы хотите, чтобы оболочка видела строку, содержащую знак доллара, вам необходимо (а) вызвать make с правильно заключенным значением и (б) использовать в своем рецепте правильные экранирующие кавычки. Например:
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}
но вы должны быть осторожны, когда используете это.
Какой
makeвы используете и из какой оболочки запускаете? Вариант вашего make-файла, в котором отсутствуетgo run, выдает ожидаемый результат с помощью командыmake run pwsd = "passwd$". Это касается Bash 4.4.20 и GNU make 4.2.1.