Pregunta

¿Es posible cambiar el directorio actual a partir de un guión?

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

#!/bin/bash
cd /home/artemb

Cuando ejecuto el script desde el Bash el directorio actual no cambia. ¿Es posible en absoluto para cambiar el directorio actual del shell de un guión?

¿Fue útil?

Solución

Es necesario para convertir su secuencia de comandos para 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 se ejecuta un programa de la cáscara que se ejecute en un nuevo proceso. El "CD" estándar "pushd" y "popd" se BuiltIn al intérprete shell para que afectan el proceso de shell.

Al hacer su programa una función de shell, que está añadiendo su propio comando en proceso y entonces cualquier cambio de directorio se refleja en el proceso de shell.

Otros consejos

Cuando se inicia la secuencia de comandos, se crea un nuevo proceso que sólo hereda su entorno. Cuando se termina, termina. Su entorno actual se queda como está.

En su lugar, usted puede comenzar su script como el siguiente:

. myscript.sh

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

A la luz de la ilegibilidad y overcomplication de respuestas, creo que esto es lo que el solicitante debe hacer

  1. añadir que la secuencia de comandos para PATH
  2. ejecutar el script como . scriptname

El . (punto) se asegurará de que el script no se ejecuta en una cáscara de niño.

El poner lo anterior en conjunto, se puede crear un alias

alias your_cmd=". your_cmd"

si no desea escribir el líder "" cada vez desea establecer el origen del script para el entorno del shell, o si simplemente no desea recordar que se debe hacer para la secuencia de comandos para que funcione correctamente.

Si está usando bash puede probar alias:

en el archivo .bashrc añadir esta línea:

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

cuando se escribe "p" en la línea de comandos, que va a cambiar el directorio.

Si ejecuta un script bash entonces se opera en su entorno actual o en los de sus hijos, nunca en la matriz.

Si objetivo es ejecutar su comando: goto.sh / home / test A continuación, trabajar de forma interactiva en / home / prueba de una forma es ejecutar un subnivel interactiva fiesta dentro de la secuencia de comandos:

#!/bin/bash
cd $1
exec bash

De esta manera usted estará en / home / test hasta que la salida (salida o Ctrl + C) de esta concha.

pushd el directorio actual se inserta en la pila de directorios y se cambia al directorio dado, popd obtener el directorio en la parte superior de la pila y los cambios a continuación a a él.

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

Simplemente vaya a

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

y agregue el código siguiente a la última línea:

alias yourcommand="cd /the_path_you_wish"

A continuación, salga del editor.

A continuación, escriba:

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

Ahora puede usar: yourcommand en el terminal

He hecho un script para cambiar de directorio. echar un vistazo: https://github.com/ygpark/dj

Básicamente utilizamos cd.. para volver de cada directorio. Pensé para que sea más fácil, dando el número de directorios con la que se necesita para volver a la vez. Se puede implementar esta utilizando un archivo de secuencia de comandos independiente 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 

a venir dos pasos hacia atrás desde el directorio actual. Explica en detalle sobre aquí . También se explica por allí cómo poner el código en ~ / .bashrc para que cada nuevo shell abierto tendrá automáticamente este nuevo comando alias. Puede añadir nuevo comando para ir a directorios específicos modificando el código añadiendo más if conditions y diferentes argumentos. También puede tirar el código de git sobre aquí .

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

Supongamos que en un iMac personal donde usted es un administrador, bajo el directorio por defecto cuando se abre una ventana de comandos, / Usuarios / jperez, este será el directorio para ir a: / Users / jperez / Escritorio / Mongo / db. 3.2.1 / bin.

Estos son los pasos que pueden tener el trabajo hecho:

  1. vi mongobin, en el que entré en: 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 he creado una utilidad llamada de cabra que se puede utilizar para facilitar la navegación.

Puede ver el código fuente en GitHub .

A partir de v2.3.1 la Descripción general del uso de 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 los diferentes proyectos sin disparar un nuevo shell.

En su caso:

cd /home/artemb

Guardar the_script como:

echo cd /home/artemb

A continuación, disparar con:

\`./the_script\`

A continuación, se obtiene en el directorio utilizando la misma consola.

Añadir debajo de la línea CD en su shellscript esto:

exec $SHELL

Declarar su ruta:

PATH='/home/artemb'     
cd ${PATH}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top