2010-10-07 16 views
49

he usado 'cambio de directorio' en mi script de shell (bash)¿Cómo ejecutar 'cd' en el script de shell y permanecer allí después de que termine el script?

#!/bin/bash 
alias mycd='cd some_place' 
mycd 
pwd 

pwd impresiones some_place correctamente, pero después de que el guión terminado mi directorio de trabajo actual no cambia.

¿Es posible cambiar mi ruta por script?

+0

Realizo algunos cambios en el código de muestra. En bash, ** cd ** sholud do en alias o función. – qrtt1

+0

similares: [? ¿Por qué no "cd" trabajo en una secuencia de comandos shell bash "] (http://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script .) –

Respuesta

65

deberá establecer el origen del archivo como:

. myfile.sh 

o

source myfile.sh 

sin abastecimiento de los cambios que va a pasar en la sub-shell y no en el shell padre que se invoque el script. Pero cuando obtiene un archivo, las líneas del archivo se ejecutan como si se escribieran en la línea de comando.

14

El script se ejecuta en una subshell separada. Eso subnivel cambios de directorio, no el intérprete lo ejecuta en una posible solución es source la secuencia de comandos en lugar de ejecutarlo:.

# Bash 
source yourscript.sh 
# or POSIX sh 
. yourscript.sh 
+0

gracias por este consejo – qrtt1

+0

gran problema tips.my resueltos – Tracy

12

Si bien la búsqueda del script que desea ejecutar es una solución, debe tener en cuenta que este script puede modificar directamente el entorno de su shell actual. Además, ya no es posible pasar argumentos.

Otra forma de hacerlo es implementar su script como una función en bash.

function cdbm() { 
    cd whereever_you_want_to_go 
    echo arguments to the functions were $1, $2, ... 
} 

Esta técnica es utilizada por autojump: http://github.com/joelthelion/autojump/wiki para ofrecerle el aprendizaje marcadores de directorio cáscara.

1

cada vez que se ejecuta un guión del intérprete de comandos de inicio de sesión, un nuevo subproceso se genera y la ejecución del script se realiza en un subshell.Once completa el guión, las salidas subshell y volverá a la shell.Hence de inicio de sesión cada vez que haces un CD a través de una secuencia de comandos, el directorio cambia a la ruta especificada por cd, pero cuando termina la secuencia de comandos, vuelve a su shell de inicio de sesión al directorio de trabajo desde donde comenzó la secuencia de comandos.

La manera de superar esto es el uso,

source yourscript.sh 

qué fuente hace es que ejecuta la secuencia de comandos como un script TCL, es decir, tiene el mismo efecto que al escribir cada línea en la línea de comandos del inicio de sesión shell y se ejecuta desde allí. De esta forma, cuando el script finaliza después de cd, permanece en ese directorio.

+0

bien explicado - gracias – SaminOz

3

Se puede lograr mediante el abastecimiento. El aprovisionamiento es básicamente ejecutar el script en el mismo shell mientras que la ejecución normal (sh test.sh o ./test.sh) creará el subcuadro y ejecutará el script allí.

prueba.sh

cd development/ 
ls 
# Do whatever you want. 

Ejecutar test.sh por

source test.sh 

. es más corto notación para source. Así también se puede hacer por

. test.sh 

Esto ejecutará la secuencia de comandos y cambie el directorio de shell actual a development/.

Cuestiones relacionadas