Cambiar el directorio en el script no cambia el directorio, ¿por qué?

Cambiar el directorio en el script no cambia el directorio, ¿por qué?

He vistoesta respuestadesde que busqué esto, pero inicialmente escribí este script:

for i in `seq 1 $1`; 
   do cd ../;
done;

No cambia de directorio. ¿Por qué esto se ejecuta como

./updir.sh 5

Respuesta1

La ejecución de un script como lo muestra crea un entorno copiado en un subshell, y cualquier cambio que realice, como la configuración de directorios o variables de entorno, afecta solo a este entorno de subshell, no al shell que llama.

Para realizar cambios en el shell actual desde un script, debe ejecutar el script dentro del shell actual usando el comando sourceo .:

. ./updir.sh 5

Puedes hacer esto automático con un alias:

alias updir='. ./updir.sh'

Alternativamente, puedes usar una función en lugar de un script:

updir()
{   for i in `seq 1 $1`; 
       do cd ../;
    done
}

Respuesta2

Porque los scripts se ejecutan en un subshell, que realiza un seguimiento del directorio de trabajo actual por separado. La solución más sencilla es utilizar una función:

function updir() {
  for i in $(seq 1 $1); do
    cd ..
  done
}

información relacionada