Linux/Unix Shell Scripting - Busco una manera algo más elegante de hacer esto

   
Vista:

Busco una manera algo más elegante de hacer esto

Publicado por Oscar (4 intervenciones) el 24/04/2012 22:24:21
Hola,

Tengo el siguiente problema, estoy creando varios shell script que tienen que utilizarse de manera anidada, para ello utilizo el comando source que me permite hacer leer código de otro fichero, el problema que tengo es que necesito saber el nombre del segundo fichero al que llamo, en el ejemplo que pongo sería 2.sh, pero al haber pasado el source $0 devuelve el nombre de 1.sh.

La "ñapa" que he probado y que funciona bien es forzar un comando que no existe el cual al provocar un error me dice en que fichero esta el error y aprovecho esto volcandolo a un fichero y luego leyéndolo ya que no puedo pasarlo a una variable al tratarse de un error.

Estoy convencido que tiene que existir una manera más elegante de hacer esto pero no se me ocurre como, de antemano, muchas gracias por vuestra ayuda.

./1.sh
1
2
3
4
echo "Estamos en 1.sh"
echo $0
echo "Llamamos a 2.sh"
source 2.sh



./2.sh
1
2
3
4
5
echo "Estamos en 2.sh"
echo $0
thne
thne 2> ficherotemporal.txt
cat ficherotemporal.txt |cut -d ":" -f 1



Ejecución
~/bin$ ./1.sh
Estamos en 1.sh
./1.sh
Llamamos a 2.sh
Estamos en 2.sh
./1.sh
/home/oscar/bin/2.sh: line 3: thne: command not found
/home/oscar/bin/2.sh
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
Imágen de perfil de xve

Busco una manera algo más elegante de hacer esto

Publicado por xve (254 intervenciones) el 25/04/2012 07:07:21
Hola Oscar, no entiendo muy bien cual es tu problema... como bien dices con $0 tienes el nombre del archivo, y con $1 el primer parámetro, $2 el segundo, ...

Me puedes comentar con mas detalle?
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

Busco una manera algo más elegante de hacer esto

Publicado por Oscar (4 intervenciones) el 25/04/2012 15:33:02
Hola xve, gracias por tu interés, el problema de usar $0 es que cuando llamo al segundo script con el source, este en realidad se esta ejecutando desde el primero y por lo tanto al llamar a $0 me devuelve el nombre del primero y no del segundo que es lo que necesito.

En cualquier caso, ya tengo la solución que pongo aquí por si le puede interesar a alguien, con esto obtenemos el nombre del fichero dónde realmente esta el código y no el del script se ha ejecutado.
1
MYLOCATION="${BASH_ARGV[0]}"
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

Busco una manera algo más elegante de hacer esto

Publicado por caic (82 intervenciones) el 25/04/2012 16:10:56
Hola,

La verdad es que yo tampoco tengo muy claro qué quieres hacer pero si me gustaría comentarte que cuando llamas a otro script con source, el contenido del segundo script se ejecuta en la misma shell que el primero. Por tanto, es normal que $0 sea el nombre del primer script.

Si ejecutaras el script en otra shell, por ejemplo:

bash 2.sh

entonces en esa segunda shell $0 sí sería igual a 2.sh.

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

Busco una manera algo más elegante de hacer esto

Publicado por Oscar (4 intervenciones) el 25/04/2012 16:21:17
Hola caic,

Te cuento un poco el objetivo de lo que estoy haciendo, tengo una serie de scripts que realizan diversas acciones, debido a que cada vez es mayor el volumen de código redundante que utilizo estoy empezando a emplear una especie de “modulos”, en este caso por ejemplo un módulo de logs.

Este módulo de logs contiene una función que será común para todos los scripts que lo llamen con lo que elimino código redundante y mejoro la forma de administrarlo, por otro lado, existe un fichero .conf que se llama exactamente igual que el módulo de logs cambiando solo la extensión, en el que configuro una serie de variables como rotación o antigüedad de los logs al cual también llamo con otro source.

Si ejecutase con un ./nombremodulologs.sh luego no puedo llamar a la función LOG () desde el script principal.

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

Busco una manera algo más elegante de hacer esto

Publicado por Oscar (4 intervenciones) el 25/04/2012 16:32:41
Hola,

Me he encontrado que MYLOCATION="${BASH_ARGV[0]}" no funciona en el script principal, por lo que si se llama al script con un enlace simbólico en $0 tengo el nombre del enlace simbólico y no el del script, se me ha ocurrido la siguiente "ñapa"

MYLOCATION="${BASH_ARGV[0]}"
if [ "$MYLOCATION" = "" ] ; then
source $0
fi
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

Busco una manera algo más elegante de hacer esto

Publicado por caic (82 intervenciones) el 26/04/2012 15:33:36
Se me ocurre que podrías pasar al segundo script su nombre como parámetro y así lo tendrías en $1. Aunque la verdad, tampoco es que sea el colmo de la elegancia :P
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

Busco una manera algo más elegante de hacer esto

Publicado por Tom (253 intervenciones) el 27/04/2012 13:40:01
¿ Por qué necesitas hacerlo con source ?

La forma más obvia es que un script invoque al siguiente ...
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