[Solucionado] Especificar en un script su ruta de trabajo tras un enlace simbólico que lo llama

Imagen de Scorpyo82
-2 puntos

Hola a todos, he colocado el hilo aquí pero no estoy muy seguro, de todas formas si hay que moverlo, ya se ha dicho mil veces... se mueve :D

Bueno, mi problema es dificil de explicar sencillo de entender.

Tengo una caperta , por ejemplo en el escritorio, dentro tengo dos script, el script-1 llama al script-2 cuando es necesario.

Todo funciona genial si pincho en el principal y le doy a ejecutar... tanto en terminal como directamente.
Es dicir, la ruta de trabajo es en la que se encuentra el script.

ok, ahora, supongamos que quiero poner un enlace simbólico en el escritorio... pues ya no funciona, porque el enlace me ejecuta el script, si, pero con la ruta de trabajo en /home/miusuario/Escritorio
Por lo tanto, cuando el script llama al script 2 no ocurre nada, pues la ruta que tiene es una ruta relativa y no una absoluta.... y la absoluta no me vale,ya que si presto el script hay que ir modificándolo.. y eso no es plan.

¿Como hago para que el enlace simbólico trabaje en la carpeta en la que se encuentra el scrip?
o
¿Puedo hacer que el script-1 reconozca donde está ubicado y así, saber donde buscar a su compañero el script-2?

De verdad, ya llevo horas con esto.... y estoy que no puedo más..

:D

Un saludo a todos y gracias de antemano.

Imagen de Scorpyo82
+1
0
-1

Siempre me pasa igual.... son las 6:14 de la mañana.... y ya he dado con la solución, justo poco después de poner el post...

Buah!

Total, resulta que cuando se ejecuta un script, este guarda su ruta en la variable $0.
Así que si queremos llamar a los archivos que hay en la ruta en la que está el script-1 solo tenemos que usar esa variable o atribuirle el valor a otra...

.$0/script-2

Más sencillo...... no podía ser...

Un saludo.

EDITO: No sirve

+1
0
-1

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.

Imagen de Scorpyo82
+1
0
-1

Pues nó.... resulta que el valor de $0 me da la ruta del enlace simbólico.....

Así que ahora estoy peor que antes....

+1
0
-1

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.

Imagen de razaAztk
+1
0
-1

#!/bin/bash

PATH_X=$(dirname $(readlink $0))
echo 'a_script :)'
$PATH_X/b_script

Referencias:
http://www.unix.com/shell-programming-scripting/42587-symbolic-links-bas...

Saludos!

+1
0
-1

void hey(int x,int y)
{
if (x && y)
 printf("http://libertadhack.blogspot.com/");
else
 printf("http://libertadpunk.blogspot.com/");
}
Imagen de Scorpyo82
+1
0
-1

Gracias razaAztk , voy a mirarlo, eres un máquina en este tema. :D

Al final he cambiado el script de manera que no tenga que ejecutar otro script...... todo lo hace en el mismo.

Voy a probarlo porque quiero solucionarlo por si otra vez no puedo modificar el script para que sea independiente....

Un saludo y de nuevo gracias.

+1
0
-1

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.

Imagen de Scorpyo82
+1
0
-1

No funciona.... lo he modificado un poquito y nada.

Ahora mismo está así:

script1

#!/bin/bash

PATH_X=$(dirname $(readlink $0))

echo "Estamos en $PATCH_X"

.$PATH_X/script2
sleep 4
dirname: falta un operando
Pruebe «dirname --help» para obtener más información.
Estamos en
/home/scorpyo/Escritorio/pruebas/script1: línea 7: /script2: No existe el fichero o el directorio

Por supuesto existe el script 2

Yo creo que el problema es la recogida de la variable dirname, porque parece que no funciona bien.

PATH_X=$(dirname $(readlink $0))

De todas formas, aunque funcione hay un problema.... y es que $0 cambia si se lanza desde un Enlace Simbólico.

Un saludo y gracias.

+1
0
-1

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.

Imagen de razaAztk
+1
0
-1

Probé el script antes de postearlo.
El problema que tienes es que ejecutas el segundo script con dos paths, la cadena './' (punto - slash) indica directorio actual (como una path relativa) (desde donde ejecutas el script) y el $(dirname $(readlink $0)) te da la path absoluto del primer script (osease desde / (root). Además el readline entrega la path a donde apunta el enlace simbólico). Así que si ejecutas: .$PATH_X/script2 es como si fuese un /home/xxx/Desktop/home/xxx/Pruebas/sript2. Lo que tienes que hacer es quitarle el ./

#!/bin/bash

PATH_X=$(dirname $(readlink $0))
echo 'a_script :)'
$PATH_X/b_script

Saludos!

EDITO: Otra falla que tienes es que en una parte tienes la variable PATH_X y en otra PATCH_X. Usa otro nombre que te sea más fácil recordar, como DIR_X

+1
0
-1

void hey(int x,int y)
{
if (x && y)
 printf("http://libertadhack.blogspot.com/");
else
 printf("http://libertadpunk.blogspot.com/");
}
Imagen de Scorpyo82
+1
0
-1

Pues nada... no lo comprendo.

Ahora mismo lo tengo así:

#!/bin/bash

DIRWORK=$(dirname $`readlink $0`)

echo "Estamos en $DIRWORK"

#$PATH_X/script2
sleep 4

Ruta de los archivos:

Escritorio
      |
   pruebas
      |\
      |  \___script1
      |____script2

En el escritorio tengo el enlace simbólico a script1
Y lo abra desde el enlace o desde una consola en la misma ruta, simpre me suelta esto:

readlink: operando extra «hacia»
Pruebe «readlink --help» para obtener más información.
dirname: falta un operando
Pruebe «dirname --help» para obtener más información.
Estamos en 

Gracias por la ayuda.

Le echaré un vistazo a los man.

+1
0
-1

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.

Imagen de razaAztk
+1
0
-1

Te recomiendo uses $() en vez de ``. Si de todos modos quieres usarlos tons no le pongas el $; por lo que deberías tener: DIRWORK=$(dirname `readlink $0`)

Aunque te sugiero uses el script como lo posteé:

#!/bin/bash

DIRWORK=$(dirname $(readlink $0))
echo "Estamos en $DIRWORK"
"$DIRWORK"/script2
sleep 4

Ah! y las comillas dobles que están en $DIRWORK para llamar a script2 son importantes. Si tienes espacios en la cadena el uso de " " te ayuda a que bash interprete toda la cadena como una sola orden.

--

Aún usando tu código no pude obtener el error que mencionas. Qué versión de readlink tienes? (readlink --version). Yo tengo la:

$ readlink --version
readlink (GNU coreutils) 7.4
Copyright (C) 2009 Free Software Foundation, Inc.

Saludos!

EDITO:

Ah! creo ya se que pex. Creo que llamas el enlace simbólico desde una path con espacios, por lo que readline $0 piensa que le estás metiendo varios argumentos y se confunde. La solución es también ponerle " " al argumento $0 (que es el que contiene la path de invocación con espacios).

#!/bin/bash

DIRWORK=$(dirname $(readlink "$0"))
echo "Estamos en $DIRWORK"
"$DIRWORK"/script2
sleep 4
+1
0
-1

void hey(int x,int y)
{
if (x && y)
 printf("http://libertadhack.blogspot.com/");
else
 printf("http://libertadpunk.blogspot.com/");
}
Imagen de Scorpyo82
+1
0
-1

Muchas grácias razaAztk, tenías razón, era por las comillas dobles.... aunque no había espacios, había algo que producía un fallo, ya fuera la primera / o lo que sea.

Por cierto, yo tengo la 8.5 ?¿

scorpyo@pc:~/Escritorio/pruebas$ readlink --version readlink (GNU coreutils) 8.5 Copyright © 2010 Free Software Foundation, Inc. Licencia GPLv3+: GNU GPL versión 3 o superior . Esto es software libre: es libre de cambiarlo y redistribuirlo. NO HAY NINGUNA GARANTÍA, en la medida que lo permita la ley. Escrito por Dmitry V. Levin.

Un saludo y muchísimas gracias, eres un crack

PD: Conseguí salir adelante sin esto, pero no podía dormir tranquilo sin saber que es lo que pasaba.
Esto me lo guardo de xuleta.

EDITO: Lo dejé tal y como me lo pusiste.

+1
0
-1

Si entro en Window$ estoy más tenso que en el bautizo de un gremlin.
Linux user: 545.017
Por favor, si solucionas el hilo añade [Solucionado] al título.