如何设置Capistrano中要运行的shell为bash?

15

如何在Capistrano的运行命令中将shell设置为使用bash而不是sh? 我正在尝试安装RVM,我需要执行以下命令:

run "bash < <(curl -L http://bit.ly/rvm-install-system-wide)"

如下所示:

task :install_rvm, :roles => :server do
  apps = %w(bison openssl libreadline6 libreadline6-dev zlib1g zlib1g-dev libssl-dev     libyaml-dev sqlite3 libsqlite3-0 libxml2-dev libxslt-dev autoconf subversion libcurl4-openssl-dev)
  apt.install( {:base => apps}, :stable )
  run "bash < <(curl -L http://bit.ly/rvm-install-system-wide)"
  run "rvm install 1.9.2".sh
  run "rvm use 1.9.2@global"
  run "gem install awesome_print map_by_method wirble bundler builder pg cheat"
  run "gem install -v2.1.2 builder"
  # modify .bashrc
end

但是我似乎无法使它工作,因为Capistrano正在执行:

"sh -c 'bash < <(curl -L http://bit.ly/rvm-install-system-wide)'" on ubuntu@ec2...

我在Capistrano gem中看到command.rb文件有一些代码,例如

shell = "#{options[:shell] || "sh"} -c"

但是我不清楚如何将options[:shell]传递给任务


看起来它是通过sh -c bash ...``执行bash。这不符合您的要求吗?(免责声明:我对Capistrano一无所知。) - Keith Thompson
4个回答

34

set :shell 不起作用,但这个可以:

default_run_options[:shell] = '/bin/bash'


8
请注意,对于 rvm,您可能需要使用 /bin/bash --login 命令。 - nateware

8

听起来您需要使用rvm-capistrano宝石。另一个选择是使用rvm-capistrano使用的机制,即:

set :default_shell, '/bin/bash -l'

非常好,对我在CentOS目标系统上的部署帮助很大。 - Schubie
1
这在我使用Ubuntu 14.04 LTS时非常有效。非常感谢! - Justin Fortier

1
尝试设置:shell变量。
set :shell, '/usr/bin/bash'

在Capistrano中似乎无法工作,只能使用default_run_options更改shell。 - Edwin V.

1
你也可以使用以下语法:

execute "bash -c '<command>'"

这对于使用 --login 开关设置环境特别有用,例如:

execute "bash --login -c 'rvm use 1.9.2'"

...它也适用于Capistrano 3.x版本...!

确保将命令用单引号括起来,以便作为单个参数传递给bash,并且不要过早执行路径名扩展(globbing)、参数扩展等操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接