drno-reg
@drno-reg
см не кратко

Как правильно экранировать символы $ и ' при передаче их в ansible shell?

Здравствуйте.

Хочу через ansible shell отправить команду

docker ps -aq | awk '{print $1}'

проблема возникает с одинарными кавычками

попробовал массу вариантов:

ansible -m shell -a 'docker stop \$(docker ps -aq | awk \'{print \$1}\')' server01 -i ./hosts

сработал только вот такой

ansible -m shell -a "docker stop \$(docker ps -aq | awk \"{print \$1}\")" server01 -i ./hosts

НО все-таки интересуют варианты с одинарными.

p.s. я понимаю, что в конкретном случае и docker ps -aq достаточно)
  • Вопрос задан
  • 7007 просмотров
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Почитать документацию шелла по кавычкам.

Вкратце:
1. Внутри одинарных кавычек ВСЕ символы теряют свое специальное значение. Включая backslash, поэтому
'STRING1\'STRING2'
- это не экранированная одинарная кавычка в кавычках, а строка STRING1\ в одинарных кавычках потом STRING2 без кавычек, а потом еще одна открывающая одинарная кавычка, которая незакрыта.
Можно делать так:
'STRING1'\''STRING2'

2. Внутри двойных кавычек, все символы теряют свое специальное значение кроме $, backslash и обратных одинарных кавычек. Примеры:
"${VARIABLE} \${VARIABLE} $(hostname) `hostname`"
значение VARIABLE, строка ${VARIABLE} которая раскроется позже, дважды результат команды hostname вызванный разными способами
Ответ написан
Комментировать
@MaxKozlov
Одинарные кавычки удваиваются если снаружи тоже одинарные
Ответ написан
Комментировать
xotkot
@xotkot
хорошо есть и хорошо весьма
если не хочется вручную заморачиваться с экранированием то можно сделать так:
cat <<'EOF' | jq -Rr '@sh'
dokcer stop $(docker ps -aq | awk '{print $1}')
EOF

получим:
'dokcer stop $(docker ps -aq | awk '\''{print $1}'\'')'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы