2010-12-16 16 views

Respuesta

11

No puede. Los cambios en el directorio actual solo afectan el proceso actual.

2

Ignacio es correcto. Sin embargo, como un corte atroz (totalmente desacertada y esto realmente debería conseguirme al menos 10 votos negativos) puede exec un nuevo shell cuando haya terminado

 
#!/bin/bash 
... 
cd/
exec bash 
+1

su solicitud de downvotes que gana un upvote –

+0

Esto conducirá a una cáscara extra de funcionamiento (su original) Puntos de bonificación si puede arreglar eso también. – Sorpigal

+0

Me gustó este, aunque ahora debe escribir exit dos veces para cerrar la ventana del terminal. Una mejora: exec bash -l (para que el símbolo del sistema sea razonable) –

5

Permítanme desarrollar un poco en esto:

Cuando ejecuta el script, bash crea un nuevo proceso para él, y los cambios en el directorio actual solo afectan ese proceso.

Al generar la secuencia de comandos, la secuencia de comandos se ejecuta directamente por el shell que está ejecutando, sin crear procesos adicionales, por lo que los cambios en el directorio actual son visibles para su proceso de shell principal.

Así que, como señaló Ignacio, esto no puede hacerse

0

Se puede definir una función para ejecutar en el shell actual para apoyar esto. P.ej.

md() { mkdir -p "$1" && cd "$1"; } 

tengo lo anterior en mi ~/.bashrc

+1

¿Qué tiene esto que ver con la pregunta? – mob

+1

@mob Permite a los usuarios definir una forma rápida de cambiar a un directorio específico/variable, que probablemente era la intención de la pregunta y las búsquedas posteriores.+1 – BroSlow

1

Si realmente necesita este comportamiento, puede hacer que el script devuelve el directorio, a continuación, utilizar de alguna manera. Algo así como:

#!/bin/bash 
cd /tmp 
echo $(pwd) 

y luego se puede

cd $(./script.sh) 

feo, pero hace el truco en este caso sencillo.

+0

Estoy de acuerdo - si el usuario REALMENTE necesita esto y no puede lograrlo a través de una función en la función .bashrc, lo más parecido sería ejecutar el script externo y luego cd a lo que sea el retorno SIN EMBARGO - esto implica que el script externo no puede tiene alguna interacción con el usuario porque está consumiendo todo el resultado. Esta es la razón por la cual la respuesta de William parece un poco más flexible. mayEb stderr podría ser utilizado - realmente necesita más detalles del usuario sobre el caso de uso – nhed

1

Aquí hay una idea tonta. Use PROMPT_COMMAND. Por ejemplo:

 
$ export PROMPT_COMMAND='test -f $CDFILE && cd $(cat $CDFILE) && rm $CDFILE' 
$ export CDFILE=/tmp/cd.$$ 

Entonces, hacer la última línea del script ser 'pwd> $ CDFILE'

Cuestiones relacionadas