Проблема в том, что ваш Vagrantfile - это код Ruby, а ваш скрипт sed находится внутри строки Ruby here.
Если вы попробуете этот упрощенный скрипт Ruby:
# test.rb
puts <<-SHELL
sudo sed -i.bak -e 's,\(127\.0\.0\.1[[:space:]]*localhost\),\1aa,' /etc/host
SHELL
Вы можете увидетьпроблема:
▶ ruby test.rb
sudo sed -i.bak -e 's,(127.0.0.1[[:space:]]*localhost),aa,' /etc/host
То есть \1
и другие \
были интерпретированы Ruby до интерполяции в строке здесь.
Лучший вариант для вас - этоиспользуйте обозначение <<'SHELL'
, аналогичное тому, что вы бы делали в Bash:
node.vm.provision "shell", inline: <<-'SHELL'
sed -i.bak -e 's,\(127\.0\.0\.1[[:space:]]*localhost\),\1aa,' /etc/hosts
SHELL
Другой вариант - экранировать обратную косую черту в \1
.Также обратите внимание, что, насколько я могу судить, вызов sudo
там также не требуется.
Если, однако, вам нужно интерполировать строку в этом скрипте, вы можете сделать что-то вроде этого:
# test.rb
mystring = 'aa'
$script = "sed -i.bak -e '" +
's,\(127\.0\.0\.1[[:space:]]*localhost\),\1' + "#{mystring},' /etc/hosts"
А затем у вашего поставщика:
node.vm.provision "shell", inline: $script
См. Также этот связанный ответ.