Escape backtick in Go (строка, используемая в exec.Command) - PullRequest
0 голосов
/ 15 февраля 2019

Учитывая этот код, я не могу понять, как избежать обратного удара.

var (
    MY_STRING = "something`something"
)
cmd := fmt.Sprintf("MY_ENV=%q;", MY_STRING)
out, err := exec.Command("bash", "-c", cmd).CombinedOutput()
// results in MY_ENV="something`something" ie unfinished input

Я пробовал ниже, но это приводит к "неизвестной escape-последовательности".Это работает в оболочке, очевидно.Я также пытался объединить строки и необработанные строковые литералы, но безуспешно.Как я могу избежать спины, пожалуйста?

var (
    MY_STRING = "something\`something"
)

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Используйте ', чтобы убежать ` в раковинах Борна.И не нужно заключать в кавычки строку.

MY_STRING := "something'`'something"
cmd := fmt.Sprintf("MY_ENV=%s;", MY_STRING)
out, err := exec.Command("bash", "-c", cmd).CombinedOutput()
0 голосов
/ 15 февраля 2019

Обратному трюку не нужно экранировать, чтобы Go оставил его в строке ( ref ).

Однако bash будет обрабатывать обратные тики вне строкикак синтаксис подоболочки .Самый простой способ избежать обратного удара в bash - это включить его в строку в одинарных кавычках :

var MY_STRING = "'something`something'"

Но поскольку вы используете %q в строке формата, этоне будет вести себя так, как ожидалось.

Вместо этого вы можете использовать решение, опубликованное в этом вопросе .Bash требует двойного экранирования обратной черты (\\\`) внутри двойных кавычек.Есть полное объяснение того, почему это необходимо в этом связанном вопросе.Поскольку Go также использует \ в качестве escape-символа, вам нужно удвоить каждого из них:

var MY_STRING = "something\\\\\\`something"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...