comando cd en linux para ser usado en bash
Mi entrada rapida
Hoy dia se me ocurrio hacer un script para que en bien entre al home de mi usuario en linux, pasara a una carpeta especifica con un script, cuando introduje el cd a mi script con la ruta no me entraba , aunque todo era correcto buscando en la web encontre que salia el mismo error por que no tenia que usar sh script o ./script, tenia que usar source script para que mi scripts sh pudiera correr e ir a la carpeta en mencion.
Ahora la explicacion que encontre en el internet sobre por que no funcionaba.
El script se ejecuta en un subproceso por lo que tiene su propio ámbito de trabajo (por defecto, el directorio inicial es el del proceso padre).
El comando cd funciona correctamente, solo que el directorio cambia solo en el ámbito del subproceso creado: en cuanto termina la ejecución del script, el proceso del mismo finaliza y volvemos al proceso de la shell. Como la shell nunca cambió de directorio, sigue estando en el directorio original - y por eso da la sensación de que se deshizo el cambio.
Como veran:
referencia web:
https://es.stackoverflow.com/questions/1687/por-qu%C3%A9-no-funciona-el-comando-cd-en-un-script-de-bash
Hoy dia se me ocurrio hacer un script para que en bien entre al home de mi usuario en linux, pasara a una carpeta especifica con un script, cuando introduje el cd a mi script con la ruta no me entraba , aunque todo era correcto buscando en la web encontre que salia el mismo error por que no tenia que usar sh script o ./script, tenia que usar source script para que mi scripts sh pudiera correr e ir a la carpeta en mencion.
Ahora la explicacion que encontre en el internet sobre por que no funcionaba.
El script se ejecuta en un subproceso por lo que tiene su propio ámbito de trabajo (por defecto, el directorio inicial es el del proceso padre).
El comando cd funciona correctamente, solo que el directorio cambia solo en el ámbito del subproceso creado: en cuanto termina la ejecución del script, el proceso del mismo finaliza y volvemos al proceso de la shell. Como la shell nunca cambió de directorio, sigue estando en el directorio original - y por eso da la sensación de que se deshizo el cambio.
Como veran:
Lo que ocurre en un sistema UNIX (y sucede algo similar en otros sistemas) cuando abro una terminal bash es que se lanza un proceso bash, que en este caso tiene el identificador 7546.
Todos los procesos tienen varios elementos comunes, entre ellos un directorio actual.
Todos los procesos tienen varios elementos comunes, entre ellos un directorio actual.
Como podemos ver con el comando
ps
hay un solo proceso llamado bash en ejecución al empezar.
Al ejecutar
mi_script.sh
lo que hace bash es una llamada de sistema fork()
la cual crea otro proceso hijo (el 7971) y es sobre este proceso sobre el que se ejecuta el script. Este proceso como todos los procesos tiene su particulare directorio actual. Al crearse el proceso hereda el directorio actual y la salida estandard de su padre (el 7546), por eso empieza en el mismo directorio que estaba su padre y por eso su salida sale por el mismo sitio que en el padre.
Al ejecutar
El cambio sí que tiene efectos sobre 7971, como podemos ver en el hecho de que muestra el contenido del archivo /home/test/otro-directorio/a.txt.
Cuando hacemos ps desde el proceso 7971 podemos ver que hay dos procesos bash, el hijo(7971) y el padre(7546). Este último ha ejecutado
cd
cambiamos el directorio actual del proceso 7971. Pero esto no afecta a ningún otro proceso. Por eso el proceso 7546 sigue estando en el mismo directorio que estaba.El cambio sí que tiene efectos sobre 7971, como podemos ver en el hecho de que muestra el contenido del archivo /home/test/otro-directorio/a.txt.
Cuando hacemos ps desde el proceso 7971 podemos ver que hay dos procesos bash, el hijo(7971) y el padre(7546). Este último ha ejecutado
wait(int* status)
y está esperando a que el hijo termine.
Cuando el proceso bash hijo termina su trabajo llama a
exit(int)
, el sistema operativo destruye el proceso y el padre se entera al acabar wait
y continua su ejecución. Su directorio actual sigue siendo /home/test.
Para cambiar el directorio actual sin lanzar otro proceso usa un alias
Edita tu fichero .bashrc y añade esta línea :
Edita tu fichero .bashrc y añade esta línea :
alias cdo='cd /home/test/otro-directorio'
.bashrc se carga cada vez que lanzas un terminal bash. Escribiendo el alias cdo cambiarás a ese directorio sin lanzar otro proceso bash.
referencia web:
https://es.stackoverflow.com/questions/1687/por-qu%C3%A9-no-funciona-el-comando-cd-en-un-script-de-bash

Comentarios
Publicar un comentario