Solución:
Es un comportamiento esperado. El script se ejecuta en un subshell y no puede cambiar el directorio de trabajo del shell principal. Sus efectos se pierden cuando termina.
Para cambiar el directorio del shell actual de forma permanente, debe usar el source
comando, también alias simplemente como .
, que ejecuta un script en el entorno de shell actual en lugar de un sub shell.
Los siguientes comandos son idénticos:
. script
o
source script
Para pequeñas tareas como esta, en lugar de crear un script, cree un alias como este,
$ alias cdproj='cd /dir/web/www/proj'
Deberías agregar esto a tu .bashrc
archivo, si lo desea configurar para cada shell interactivo.
Ahora puedes ejecutar esto como $ cdproj
.
Usar exec bash
al final
Un script bash opera en su entorno actual o en el de sus hijos, pero nunca en su entorno padre.
Sin embargo, esta pregunta a menudo se hace porque uno quiere quedar en el indicador de bash en un directorio determinado después de la ejecución de un script bash de otro directorio.
Si este es el caso, simplemente ejecute una instancia secundaria de bash al final del script:
#!/usr/bin/env bash
cd desired/directory
exec bash
Esto crea una nueva subcapa. Escribe control+D o exit
para volver al primer shell donde se inició inicialmente el script.
Actualizar
Al menos con las versiones más nuevas de bash
, los exec
en la última línea ya no es necesario. Además, se puede hacer que el script funcione con cualquier shell preferido usando el $SHELL
Variable ambiental. Esto entonces da:
#!/usr/bin/env bash
cd desired/directory
$SHELL