Usando o comando 'source' nos scripts bash

1

Estou escrevendo um script para tentar automatizar a configuração inicial no Ubuntu, e me deparo com um problema que não entendo. Se eu executar o seguinte código:

sudo apt-get -y update && sudo apt-get -y upgrade
sudo apt-get -y install curl git-core build-essential openssl sqlite3 apache2-prefork-dev mysql-client
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install -v 1.9.3-p392
....

o script termina, mas a maioria dos comandos falha, pois rbenv é indefinido (testado após o script terminar com rbenv -v ). Se eu, então, executar source ~/.bashrc , rbenv será definido.

No entanto, se eu executar exatamente o mesmo código, mas substituir source ~/.bashrc por source /home/username/.bashrc , então rbenv será definido e o script será concluído sem problemas. Alguém pode explicar essa discrepância? Compreendendo quando e por que o pathing relativo não funciona, suspeito que será muito útil no futuro.

    
por IanL 11.04.2013 / 16:17

2 respostas

1

Você realmente não precisa da invocação de "$ (rbenv init -)" durante a configuração inicial. Essa parte ajuda mais tarde, ao usar o rbenv em ambientes interativos e pode adicionar alguma opacidade ao depurar um script.

Tente adicionar antes da invocação real do rbenv:

export PATH="$HOME/.rbenv/bin:$PATH"

Na verdade, para usar o rbenv em scripts, basta adicionar esse e os diretórios shims ao seu caminho.

Quanto à falha da 'fonte', a fonte é um basismo. Se você está assumindo que bash é o shell padrão e usa #! / Bin / sh como hashbang, então o ubuntu pode estar jogando alguns truques com você (o padrão é traço do IIRC).

    
por 13.04.2013 / 00:54
0

~ e $HOME devem sempre se referir ao mesmo caminho, então eu esperaria que algo mais fosse esquecido.

Possíveis problemas:

  • Você está executando este script com sudo ? Em caso afirmativo, $HOME pode ser a casa de root .
  • O $HOME não é /home/username/ ? Enquanto /home/username é o caminho padrão para o diretório inicial, ele pode ser configurado de outras maneiras. Experimente echo $HOME para verificar.

Para ter uma ideia melhor do que está acontecendo:

  • Jogue uma linha
    set -ex
    no topo. O -e o faz sair na primeira falha, e o -x faz com que ele imprima o que está acontecendo enquanto é executado.
  • Adicionar
    echo "$ (env)"
    no topo para obtê-lo para imprimir o ambiente, ou se você tiver definido -x ou set -ex acima, simplesmente adicione um env
por 12.04.2013 / 04:49

Tags