Linux - Shell script se sale del directorio

 
Vista:

Shell script se sale del directorio

Publicado por Kubaru Tacn (4 intervenciones) el 04/01/2008 21:24:25
Buenas... Estaba haciendo un script muy simple con el que pueda, desde la consola, acceder a mis directorios mas visitados (digase, favoritos, bookmarks) por ejemplo:

kubaru@zaphir:~$ d
[h]ome
[d]descargas
[t]mp

Al presionar la tecla 't' deberia suceder esto:

kubaru@zaphir:/tmp$

El problema es el siguiente, si ejecuto el script con la ruta completa, o parado en el mismo directorio donde se encuentra el script funciona barbaro:

kubaru@zaphir:~$ . /usr/bin/d
[h]ome
[d]descargas
[t]mp
t
/tmp
kubaru@zaphir:/tmp$

Pero llamando desde el prompt a 'd', no pasa nada! si incluyo algun echo `pwd` dentro de los if veo que cambia correctamente de directorio, y la variable $? da 0. Pero luego aparezco nuevamente en el directorio que me encontraba antes de llamar al scritp.

Si alguno ya sufrio un tema similar, por favor que avise, alguna variable de entorno algo... encima con otros scripts mas avanzados me pasaba que perdía el directorio de donde lo llamaba y quedaba parado en cualquier lado (donde haya terminado de ejecutarse el script) pero no encuentro diferencias. Estoy corriendo un bash 3.2.25(1)

También probé haciendo un script que llame a este ultimo script, uno que solo haga . /usr/bin/d, para simular estar llamandolo con la ruta completa, o hacer un cd /usr/bin antes del restp del codio... pero nada cambio.

Este es el pequeño codigo:

#!/bin/bash

echo "[h]ome"
echo "[t]mp"
echo "[d]escargas"
echo "t[m]"

read -n1 opcion

if [[ $opcion == "h" ]]; then
cd $HOME
elif [[ $opcion == "t" ]]; then
cd /tmp
elif [[ $opcion == "d" ]]; then
cd $HOME/descargas
elif [[ $opcion == "m" ]]; then
cd $HOME/apps/tm
fi

echo `pwd`

Muchas gracias a todos los que leyeron, y a los que puedan ayudar.
Un abrazo!
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

RE:Shell script se sale del directorio

Publicado por n0str0m0 (1503 intervenciones) el 05/01/2008 20:42:21
Cuando ejecutas el shell script haciendo:

. /bla/bla/script

lo que estás haciendo es decirle a bash que _no_ haga un fork y un exec, es decir, el cd, se hace en el mismo bash en el que estás tecleando, por lo que al terminar el script, el resultado permanece.

Si lo haces de otra forma, lo que sucede es lo siguiente:

tu bash tiene, digamos un PID = 456
tecleas d (y tienes la ruta en tu PATH, por ejemplo)
bash hace un fork de si mismo y ahora tienes otro bash con digamos PID = 999
En el bash con PID = 999 se hace el cambio de directorio.
Cuando tu programa termina, el bash finaliza y vuelve al bash que lo invocó (el de PID = 456) y que _no_ ha cambiado su ruta de trabajo.

Salu2
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

RE:Shell script [..] Gracias!

Publicado por Kubaru Tacn (4 intervenciones) el 08/01/2008 20:49:19
Muchas gracias, n0str0m0, excelente explicación. Clarísimo. Lo solucioné de una manera medio sucia, pero en fin... hace lo que tiene que hacer:

Una forma es ejecutar el script con el comando 'source' que utiliza el mismo ambiente del shell actual, otra, con la ruta completa al archivo. Por lo tanto, me hice un alias d='source /usr/bin/d' y listo...

Igual me queda pendiente entender como ejecutar un script sin fork ni exec para el futuro.

Muchas gracias nuevamente.
Adios
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