resueltos - scripts bash ejemplos
Cambiar el directorio actual desde un script Bash (13)
¿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?
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
- agrega esa secuencia de comandos a la
PATH
- ejecutar el script como
. scriptname
. scriptname
El .
(dot) se asegurará de que el script no se ejecute en un shell hijo.
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 here . 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 here .
Con pushd, el directorio actual se inserta en la pila de directorios y se cambia al directorio dado, popd obtiene el directorio en la parte superior de la pila y luego lo cambia a él.
pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
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
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:
- 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. -
chmod 755 mongobin
-
source mongobin
-
pwd
Voila!
He hecho una secuencia de comandos para cambiar el directorio. echa un vistazo: https://github.com/ygpark/dj
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.
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.
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 programa 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 programa 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.
Si ejecuta un script bash entonces funcionará en su entorno actual o en los de sus hijos, nunca en el padre.
Si el objetivo 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.
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.
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
También creé una utilidad llamada goat que puedes usar para una navegación más fácil.
Puede ver el código fuente en goat .
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