Script Bash instalando em vários diretórios [closed]

0

Eu estou tentando escrever um script bash que irá instalar o rbenv do começo ao fim. Eu estou em um Mac por causa do interesse.

Mas há algumas coisas que não estão funcionando principalmente estou mudando o diretório, mas apenas no subshell.

#!/bin/bash
echo "installing rbenv ruby manager manager"
cd ~
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source .bash_profile

echo "installing ruby build for rbenv"
git clone https://github.com/sstephenson/ruby-build.git
cd ruby-build
sudo ./install.sh

echo "rbenv and ruby-build have been installed, installing ruby now.."
sleep 2

read -p "would you like chronospere to install ruby 1.9.3 [y/n]" RESP
if [ "$RESP" = "y" ]; then
  rbenv install 1.9.3-p327
  rbenv rehash
  rbenv global 1.9.3-p327
  ruby -v
else
  echo "alrigt skipping.. vagrant has rbenv installed you can install ruby it at your leisure "
  echo "hold cmd, and double clck https://github.com/sstephenson/rbenv for more info"
fi

cd ~

Portanto, parece que a instalação funciona. Mas a maior parte do meu código não é executada ou não é executada no lugar que eu gostaria.

vagrant@precise64:/vagrant$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]
vagrant@precise64:/vagrant$ rbenv
The program 'rbenv' is currently not installed.  You can install it by typing:
sudo apt-get install rbenv

Como você pode ver, é como se nada estivesse instalado. O source .bash_profile nunca aconteceu

vagrant@precise64:/vagrant$ cd      
vagrant@precise64:~$ cd ~ 
vagrant@precise64:~$ source .bash_profile 

Depois que eu manualmente forneço o bash_profile,

vagrant@precise64:~$ rbenv
rbenv 0.4.0-45-g060f141
vagrant@precise64:~$ rbenv versions
  * system (set by /home/vagrant/.rbenv/version)
  1.9.3-p327
vagrant@precise64:~$ rbenv global 1.9.3-p327
vagrant@precise64:~$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]

Então, como você pode ver, é como se o código estivesse rodando, simplesmente não se movendo de um diretório para outro. Eu nem sei se isso é possível com um script bash. Eu mudo de ~ / (HOME) para /ruby-build de volta para ~ e então para /vagrant . Isso é possível em um único script bash. isso é estranho porque se eu abrir o terminal e rodar esse código linha por linha ele funciona 100%.

    
por TheLegend 30.05.2013 / 11:02

1 resposta

1

A razão mais direta é mencionada por @ l0b0: você precisa atualizar a variável PATH do seu shell atual , que você faz com source .bash_profile (ou . .bash_profile ). Qualquer outro shell criado após você ter atualizado o arquivo de inicialização do shell pelo seu script funcionará "fora da caixa" (porque ele usará o arquivo init atualizado).

Dito isto, a menos que você queira se deparar com uma confusão terrível, mais cedo ou mais tarde, você provavelmente vai querer arrumar isso um pouco. Os principais problemas que vejo são:

  1. use algum gerenciamento de pacotes sempre que possível - como um usuário de Mac você pode querer olhar para um questão relacionada no SuperUser SE. Não usar o gerenciamento de pacotes geralmente é uma prática ruim (embora haja exceções a essa regra).

  2. sudo ... é garantido para funcionar? Você realmente precisa instalá-lo na raiz, já que você tem rbenv em seu diretório inicial? Isso está conectado ao ponto anterior.

  3. enquanto ~/.rbenv/bin é provavelmente bom, geralmente é melhor imitar o FHS geral em seu próprio diretório (tendo bin/ , etc/ , lib/ etc. diretamente lá ou colocando-o em um subdiretório separado).

  4. talvez você queira usar set -e para anular o script em quaisquer erros (para os quais não está verificando explicitamente) - consulte help set ou man bash para obter mais detalhes. git clone é o primeiro candidato aqui - se o repositório já existe, o clone falha, mas o script aceita isso silenciosamente.

  5. >> ~/.bash_profile provavelmente poluirá o arquivo init do seu shell. Embora seja possível verificar se as linhas já estão lá, mal imprimir uma nota lembrando sobre a necessidade de adicioná-las manualmente para que a instalação funcione corretamente pode, na verdade, ser mais útil. Especialmente quando você decide dar o script para outra pessoa.

por 30.05.2013 / 15:02