Cambiar el directorio actual desde un script Bash

¿Es posible cambiar el directorio actual de un script?

Quiero crear una utilidad para la navegación de directorio en Bash. Creé un script de prueba que se parece a lo siguiente:

#!/bin/bash cd /home/artemb 

Cuando ejecuto el script desde el shell Bash, el directorio actual no cambia. ¿Es posible cambiar el actual directorio de shell de un script?

Necesita convertir su script a una función de shell:

 #!/bin/bash # # this script should not be run directly, # instead you need to source it from your .bashrc, # by adding this line: # . ~/bin/myprog.sh # function myprog() { A=$1 B=$2 echo "aaa ${A} bbb ${B} ccc" cd /proc } 

La razón es que cada proceso tiene su propio directorio actual, y cuando ejecuta un progtwig desde el shell se ejecuta en un nuevo proceso. El estándar “cd”, “pushd” y “popd” se incorporan al intérprete de shell para que afecten al proceso de shell.

Al hacer de su progtwig una función de shell, está agregando su propio comando en proceso y luego cualquier cambio de directorio se refleja en el proceso de shell.

Cuando inicia su secuencia de comandos, se crea un nuevo proceso que solo hereda su entorno. Cuando termina, termina. Tu entorno actual se mantiene como está.

En cambio, puede iniciar su script de esta manera:

 . myscript.sh 

El . evaluará la secuencia de comandos en el entorno actual, por lo que podría ser alterado

A la luz de la imposibilidad de leer y de la complicación de las respuestas, creo que esto es lo que el solicitante debe hacer

  1. agrega esa secuencia de comandos a la PATH
  2. ejecutar el script como . scriptname . scriptname

El . (dot) se asegurará de que el script no se ejecute en un shell hijo.

Juntando lo anterior, puedes hacer un alias

 alias your_cmd=". your_cmd" 

si no quieres escribir el “principal”. cada vez que desee generar el script en el entorno de shell, o si simplemente no desea recordar que debe hacerse para que el script funcione correctamente.

Si usas bash puedes probar alias:

en el archivo .bashrc agrega esta línea:

 alias p='cd /home/serdar/my_new_folder/path/' 

cuando escribe “p” en la línea de comando, cambiará el directorio.

Si ejecuta un script bash entonces funcionará en su entorno actual o en los de sus hijos, nunca en el padre.

Si el objective es ejecutar su comando: goto.sh / home / test Luego trabaje de manera interactiva en / home / test de una manera es ejecutar una subshell interactiva bash dentro de su script:

 #!/bin/bash cd $1 exec bash 

De esta forma estarás en / home / test hasta que salgas (exit o Ctrl + C) de este shell.

Con pushd, el directorio actual se inserta en la stack de directorios y se cambia al directorio dado, popd obtiene el directorio en la parte superior de la stack y luego lo cambia a él.

 pushd ../new/dir > /dev/null # do something in ../new/dir popd > /dev/null 

Simplemente ve a

 yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor 

y agrega este código al lado de la última línea:

 alias yourcommand="cd /the_path_you_wish" 

Luego salga del editor.

Luego escribe:

 source ~/.bashrc or source ~/.bash_profile on MAC. 

ahora puedes usar: tu comando en la terminal

He hecho una secuencia de comandos para cambiar el directorio. echa un vistazo: https://github.com/ygpark/dj

Básicamente usamos cd.. para volver de cada directorio. Pensé en hacerlo más fácil dando la cantidad de directorios con los que debe volver a la vez. Puede implementar esto usando un archivo de script separado usando el comando alias. Por ejemplo:

code.sh

 #!/bin/sh _backfunc(){ if [ "$1" -eq 1 ]; then cd .. elif [ "$1" -eq 2 ]; then cd ../.. elif [ "$1" -eq 3 ]; then cd ../../.. elif [ "$1" -eq 4 ]; then cd ../../../.. elif ["$1" -eq 10]; then cd /home/arun/Documents/work fi } alias back='_backfunc' 

Después de usar source code.sh en el shell actual, puede usar:

 $back 2 

para venir dos pasos atrás del directorio actual. Explicado en detalle aquí . También se explica cómo colocar el código en ~ / .bashrc para que cada nuevo shell abierto tenga automáticamente este nuevo comando de alias. Puede agregar un nuevo comando para ir a directorios específicos modificando el código agregando más if conditions y argumentos diferentes. También puedes extraer el código de git aquí .

Este enfoque es más fácil para mí.

Supongamos que en un iMac personal donde usted es un administrador, bajo el directorio predeterminado cuando se abre una ventana de comandos, / Users / jdoe, este será el directorio para ir a: /Users/jdoe/Desktop/Mongo/db.3.2.1 /compartimiento.

Estos son los pasos que pueden hacer el trabajo:

  1. vi mongobin, en el que cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin : cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin como la primera línea.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

Voila!

También creé una utilidad llamada cabra que puedes usar para una navegación más fácil.

Puede ver el código fuente en GitHub .

A partir de la v2.3.1, la descripción general del uso se ve así:

 # Create a link (h4xdir) to a directory: goat h4xdir ~/Documents/dev # Follow a link to change a directory: cd h4xdir # Follow a link (and don't stop there!): cd h4xdir/awesome-project # Go up the filesystem tree with '...' (same as `cd ../../`): cd ... # List all your links: goat list # Delete a link (or more): goat delete h4xdir lojban # Delete all the links which point to directories with the given prefix: goat deleteprefix $HOME/Documents # Delete all saved links: goat nuke # Delete broken links: goat fix 

Me gusta hacer lo mismo para diferentes proyectos sin encender un nuevo shell.

En tu caso:

 cd /home/artemb 

Guarde el_script como:

 echo cd /home/artemb 

Luego, enciéndalo con:

 \`./the_script\` 

Luego llegas al directorio usando el mismo shell.