Ну, это немного перефакторинг, но решение состоит в том, чтобы обернуть все в один вызов su - (user) -c "bla", который автоматически выйдет из подоболочки как (user), как только все команды будут выполнены. сделано.
Синтаксис:
su - (пользователь) -c "команда"
Вот как бы я это сделал:
Обратите внимание, что мы должны разбивать команды с помощью ';' и экранировать двойные кавычки с помощью '\'.
#!/bin/bash
# Pulls from remote repo and implements changes
su - rails -c "cd /var/www/myapp/code;
git pull;
expect \"sername for 'https://bitbucket.org':\";
send \"myusername\";
interact;
expect \"assword for 'https://bitbucket.org':\";
send \"mypassword\";
interact" # Now that the final command's ran,
# we'll auto - exit the subshell
cd /var/www/myapp/code
RAILS_ENV=production bundle exec rake assets:clobber
RAILS_ENV=production bundle exec rake assets:precompile
nginx -t && sudo nginx -s reload