Особенность работы метода run в Capistrano

Потратил сегодня полтора часа пытаясь заставить работать следующий код:

task :tmp_list, :roles => [:app] do
  run <<-CMD
if [ -d /tmp/ ];
then
  ls /tmp/
fi
CMD
end

и получал одну и ту же ошибку

  * executing `tmp_list'
  * executing "if [ -d /tmp/ ];\\\nthen\\\n  ls /tmp/\\\nfi"
    servers: ["111.111.111.111"]
    [111.111.111.111] executing command
*** [err :: 111.111.111.111] Syntax error: end of file unexpected (expecting "fi")
    command finished
failed: "sh -c \"if [ -d /tmp/ ];\\\\\nthen\\\\\n  ls /tmp/\\\\\nfi\"" on 111.111.111.111

Проблема заключалась в том что sh передаётся команда содержащая символы переноса строки. В man-е освящене этого момента я не нашел.

Обойти эту проблему можно как минимум двумя способами:

1) Избавится от переносов строк. Тогда код будет выглядеть примерно так:

task :tmp_list, :roles => [:app] do
  run "if [ -d /tmp/ ]; then ls /tmp/ ; fi"
end

2) Либо использовать условные операторы

task :tmp_list, :roles => [:app] do
  run "([ -d /tmp/ ] && ls /tmp/) || true"
end

Трюк с true нужен для того чтобы в случае неудачи (если директория не будет найдена) выполнение набора комманд завершилось с кодом ошибки равным нулю (что означает что проблем при выполнении не возникло)

Тэги: capistrano
Будь всегда в курсе последних новостей блога подписавшись на новости
в формате RSS. Присоединяйся!
* * *

Добавить новый комментарий

Доступные BB теги

*

* (не будет опубликован)

(если есть)

  • Multi CAPTCHA Refresh2
  • *

1. Проверьте комментарий перед отправкой
2. Все комментарии проходят модерацию перед публикацией в блоге