Linux/Unix Shell Scripting - Ayuda con script bash

 
Vista:
sin imagen de perfil

Ayuda con script bash

Publicado por Wazabee (7 intervenciones) el 11/01/2016 15:02:58
Hola a tod@s. Estoy intentando hacer un script muy básico en bash para automatizar una serie de tareas como por ejemplo instalar ruby a través de rbenv. Vaya por delante que sé muy poco de programación y que esta es una de mis primeras incursiones en el arte del scripting, con lo que me surgen muchas dudas y más problemas... Dicho esto, paso a exponer el tema:
La primera duda que tengo es qué diferencia ha entre #!/bin/bash y #!/bin/sh. Se que sh indica el interprete a utilizar, pero no se si bash y sh son lo mismo o no. Perdonad mi ignorancia... Después el script empieza con un apt-get update y upgrade, e instala algunos paquetes dependencias y librerias. Hasta ahí bien, facilfacil, sin problemas. Cuando acaba de instalar los paquetes lo siguiente que debería hacer es instalar ruby a través de rbenv. Aquí es donde empiezan los problemas...El código es el siguiente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd ~
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
 
exec $SHELL
 
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
 
git clone git://github.com/dcarley/rbenv-sudo.git ~/.rbenv/plugins/rbenv-sudo
 
exec $SHELL
 
rbenv install 2.1.7
rbenv global 2.1.7
ruby -v
En esta parte me da dos fallos. Cuando lee el primer
1
exec $SHELL
el script se para y deja de hacer todo lo demás. No se que significa esa linea de código ni cuál es su función. Saberlo ayudaría a solucionar la historia. Lo que si se es que, si quito esa línea ( y el otro
1
exec $SHELL
, que me da el mismo problema) el script sigue adelante. Me gustaría saber cómo puedo hacer que cuando lea esas líneas no se pare ahí y siga haciendo lo que tiene que hacer...
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con script bash

Publicado por Tom (361 intervenciones) el 11/01/2016 15:31:58
En la mayoría de sistemas Linux, /bin/sh es un link a /bin/bash, o sea que son lo mismo.
Es curioso lo de esos "exec" ahí en el medio. Si has copiado el código de otra parte, probablemente te falten cosas.
exec, por definición, finaliza la ejecución de tu programa, que se convierte en el que le pases como parámetro (el contenido de la variable $SHELL en tu caso).

En todo caso, dado que tu script modifica el .bashrc, probablemente esos exec /bin/sh estén ahí para forzar la reevaluación del .bashrc, pero no funcionaría nunca tal y como lo has copiado, así que lo mejor que puedes hacer es quitar esas dos líneas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda con script bash

Publicado por Wazabee (7 intervenciones) el 11/01/2016 16:05:14
Ok, gracias. Entiendo entonces que esos exec ahí no son relevantes para la instalación de ruby a través de rbenv,no? Esa parte del codigo esta copiada de una web y, escrito linea por linea en la terminal, tal cual como está en el script, suele funcionar (digo "suele" por que esa es otra cosa que no llego a comprender. Por qué, a veces, instalas algo de una manera y, al volverlo a hacer en una distro "limpia", el resultado no es siempre el esperado...) Como el tuto está pensado para instalar ruby a través de consola, quizá es por eso que los usa...pero claro, al automatizarlo con un script, igual no son necesarios. Los quito entonces.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda con script bash

Publicado por Wazabee (7 intervenciones) el 12/01/2016 10:21:35
Bueno...he quitado esos
1
exec $SHELL
y parece que son absolutamente necesarios porque, cuando lee las líneas
1
2
rbenv install 2.1.7
rbenv global 2.1.7
me dice que rbenv no está instalado. Que lo instale con apt-get, pero eso no debe ser así. Si una vez acabada esa parte del script, introduzco el
1
exec $SHELL
manualmente, rbenv si funciona, o sea que necesito saber como hacerlo para sustituir el exec por otro comando que haga lo mismo para que el script no se pare...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con script bash

Publicado por Tom (361 intervenciones) el 12/01/2016 11:01:39
No conozco ruby, ni rbenv.
Pero lo que tienes que hacer es poner en el entorno de tu script en ejecución lo mismo que pones en el .bashrc
Algo así como (insisto en que no sé qué hace rbenv):

PATH=$HOME/.rbenv/bin:$PATH
eval $(rbenv init -)
rbenv install 2.1.7
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda con script bash

Publicado por Wazabee (7 intervenciones) el 12/01/2016 13:20:25
Gracias por tu ayuda Tom. Si hago lo que me comentas, el script parece que instala ruby 2.1.7, pero al hacerle, cuando acaba, un
1
ruby -v
me tendria que dar como versión actual algo similar a esto
1
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]

Pero lo que me reponde la terminal es que la versión de ruby que consta como activa es la 1.9.1, si no recuerdo mal, que es la que viene por defecto en la distro que me ocupa. Así que no me acaba de funcionar no sé por qué. La solución que se me ha ocurrido y me funciona, aunque es poco práctica y no es lo que yo quería, ha sido dividir el script en 3 partes y, cuando lee esos
1
exec $SHELL
y vuelve a la consola, ejecutar a mano otro script que contiene la siguiente "fase" hasta el siguiente
1
exec $SHELL
cuando el segundo script lee su exec y vuelve a consola, entonces ejecuto a mano el tercer script que es el que contiene la instalación final de ruby 2.1.7
1
2
rbenv install 2.1.7
rbenv global 2.1.7

De esta manera al hacerle un
1
ruby -v

ya me consta la versión 2.1.7 como activa.

Sigo queriendo hacerlo todo del tirón con un solo script, pero de momento, con los conocimientos que tengo, esto es lo que puedo hacer...
Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con script bash

Publicado por Tom (361 intervenciones) el 12/01/2016 14:56:09
Aún puedes hacer otra prueba (es una pena, yo no tengo nada de ruby en mis pc para probar). En lugar de exec $SHELL puedes intentar reevaluar el .bashrc (que es el quiz de la cuestión, en mi opinión).

Para ello, en tu script original que pegaste aquí, cambia
exec $SHELL
por
. ~/.bashrc

(punto espacio ~/.bashrc)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con script bash

Publicado por Tom (361 intervenciones) el 12/01/2016 18:03:32
He podido, al final, probar esto, y funciona. Pero todo depende del .bashrc que se supone que se ejecutará cada vez que el usuario hace login, cosa que en mi linux no ocurre (el que se ejecuta siempre es el .profile no el .bashrc):

Ah! y he cambiado la url del git para que me funcione, eso no lo toques si no te hace falta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
cd
 
git clone https://github.com/rbenv/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
 
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
 
git clone https://github.com/dcarley/rbenv-sudo.git ~/.rbenv/plugins/rbenv-sudo
 
. ~/.bashrc
 
rbenv install 2.1.7
rbenv global 2.1.7
 
ruby -v
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda con script bash

Publicado por Wazabee (7 intervenciones) el 25/01/2016 11:21:20
Hola Tom,
Gracias por tu ayuda pero esto último tampoco me funciona. De todos modos he encontrado una solución al problema creando un menu y dividiendo el script en tres partes. No es lo más ortodoxo, pero ya me sirve.
Gracias de nuevo.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar