646 votos

¿Por qué ' t "cd" trabajar en un script de shell bash?

Estoy tratando de escribir un pequeño script para cambiar el directorio actual a mi directorio de proyecto:

#!/bin/bash
cd /home/tree/projects/java

Guardar este archivo como proj, cambió el chmod, copiado a /usr/bin . Cuando yo lo llamo: proj , no hace nada. ¿Qué estoy haciendo mal?

547voto

Greg Hewgill Puntos 356191

Shell scripts se ejecutan dentro de un subshell y cada subshell tiene su propio concepto de lo que es el directorio actual. El cd tiene éxito, pero tan pronto como sale el subshell, estás en el shell interactivo y no ha cambiado nada allí.

Una forma de evitar esto es utilizar un alias en lugar de otro:

alias proj="cd /home/tree/projects/java"

433voto

Adam Liss Puntos 27815

Estás haciendo nada malo! Has cambiado el directorio, pero sólo dentro del subshell que ejecuta el script.

Puede ejecutar el script en el proceso actual con el comando "punto":

. proj

Pero yo prefiero a sugerencia de Greg para utilizar un alias en este caso simple.

201voto

DigitalRoss Puntos 80400

El cd en su guión técnico trabajó como cambió el directorio de la cáscara que corrió el guión, pero eso fue un proceso separado bifurcado de la shell interactiva.

Manera compatible con Posix para resolver este problema es definir un procedimiento de shell en lugar de una concha invoca comandos.

jhome () {
  cd /home/tree/projects/java
}

Sólo puede escribir esto en o ponerlo en uno de los varios archivos de arranque de shell.

132voto

Tzachi.e Puntos 291

El cd se realiza dentro de la cáscara de las secuencias de comandos, las salidas de la cáscara, y luego te quedan en el directorio lo obtuvieron... el guión, no ejecutarlo. En lugar de:

# ./myscript.sh

hacer

# . ./myscript.sh

(Observe el punto, espacio y nombre de secuencia de comandos)

90voto

Matt Thomas Puntos 639

Para hacer un script en bash que le de cd a un directorio :

Crear el archivo de secuencia de comandos

#!/bin/sh
# archivo : /scripts/cdjava
#
cd /home/askgelal/proyectos/java

A continuación, crear un alias en el archivo de inicio.

#!/bin/sh
# archivo /scripts/mastercode.sh
#
alias cdjava='. /scripts/cdjava'

  • He creado un archivo de inicio donde he volcado todo mi alias y funciones personalizadas.
  • Luego que la fuente de este archivo en mi .bashrc que se han fijado en cada arranque.

Por ejemplo, crear un maestro de alias y funciones de los archivos: /scripts/mastercode.sh
(Poner el alias en este archivo.)

Luego, al final de su .bashrc archivo:

fuente /scripts/mastercode.sh



Ahora es fácil de cd en el directorio de java, simplemente escriba cdjava y usted está allí.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X