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 source
o .
:
. ./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
}