Как передать '$' => специальный символ в качестве аргумента для make-файла

Я пытался передать пароль для 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$

Какой make вы используете и из какой оболочки запускаете? Вариант вашего make-файла, в котором отсутствует go run, выдает ожидаемый результат с помощью команды make run pwsd = "passwd$". Это касается Bash 4.4.20 и GNU make 4.2.1.

John Bollinger 23.07.2024 22:32

Также обратите внимание, что pwsd:=$1 почти наверняка не делает того, что вы думаете.

John Bollinger 23.07.2024 22:33

Вам необходимо подавить расширение параметров. Отсюда make run 'pwsd=passwd$$' или make run pwsd=passwd\$\$, в зависимости от ваших стилистических предпочтений.

user1934428 24.07.2024 08:19

@user1934428 => Спасибо, чувак, это сработало.

KARTHIK J 25.07.2024 16:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, при отладке 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}

но вы должны быть осторожны, когда используете это.

Другие вопросы по теме