2010-09-18 35 views
5

Cuando creé mi propio shell, no puedo ejecutar el comando cd que puedo hacer en el shell de Linux. ¿Porqué es eso?¿Por qué el comando cd no funciona en mi programa shell?

+0

Si el error es "Comando no encontrado", puede ser algo relacionado con "RUTA". ¿Qué dice 'echo $ PATH'? –

+1

¿Has creado tu propio caparazón? Sin un comando 'cd'? ¿Por qué hiciste eso? – Johnsyweb

Respuesta

5

Eso es probablemente porque el comando cd tiene que estar integrado en el shell, no algo externo y ejecutado. Si un comando externo cambió de directorio, no tiene efecto en el shell principal. Y no hay comandos /bin/cd o /usr/bin/cd.


No entiendo la línea "Si el comando externo cambió directorio, no tiene ningún efecto en la cáscara de los padres".

Normalmente, cuando un shell ejecuta un comando, lo hace fork() y el proceso hijo utiliza exec() para ejecutar la orden introducida por el usuario. Por ejemplo, si el comando ingresado es 'ls /', el shell se arregla para ejecutar /bin/ls con dos argumentos, ls y /. Sin embargo, si el comando seleccionado ejecuta la llamada al sistema chdir(), eso afecta el proceso secundario, pero no afecta al shell primario. Por lo tanto, el shell tiene que manejar el comando cd, no a través de fork() y exec().

Tenga en cuenta que en DOS, un archivo .BAT puede hacer cd y afecta el proceso cmd.exe. Esto no ocurre en Unix: un proceso hijo no puede afectar el directorio actual del proceso principal.

+0

gracias por la respuesta pero no entendí la línea "Si el comando externo cambió el directorio, no tiene ningún efecto en el shell principal". – phani987

+2

Unix/Linux y DOS son iguales ya que cada proceso tiene su propio directorio actual. La diferencia es que en DOS, los archivos BAT (y los archivos BAT anidados) se ejecutan mediante el proceso cmd.exe actual, mientras que en Unix/Linux, la ejecución de un script de shell inicia un nuevo proceso de shell. En Unix/Linux, si ejecuta un CD dentro de un script, cambia el directorio actual del shell que afectará los comandos posteriores en el mismo script. Pero el shell que inició el script no se ve afectado. –

+0

@Adrian: tiene razón; me pregunté si dejar ese último párrafo o si confundiría el PO. Tu explicación es más clara que la mía. –

2

Jonathan Leffler explicó por qué esto fue así, pero quería ofrecer una solución en caso de que realmente necesite esta funcionalidad. En bash (no especificó, así lo supondré), el comando source se puede usar para ejecutar un script de shell en el proceso de shell CURRENT. Yo uso algo similar a la de abajo (aunque más amplio), junto con un alias de la cáscara, para cambiar a los directorios del proyecto y automágicamente configurar el entorno:

~:$ cat $HOME/bin/goproj 
#!/bin/bash 
... 
export SOMEVAR=someval 
cd /home/foo/src/projects/"$1" 
... 

~:$ alias gp 
alias gp="source $HOME/bin/goproj" 

~:$ gp foo 
~/src/projects/foo:$ echo $SOMEVAR 
someval 
~/src/projects/foo:$ 

El uso de este tipo de configuración, puede modificar el shell actual con todo lo que existe en el script que estás buscando. Tenga en cuenta que si ejecuta 'goproj' directamente, no funcionaría para el mismo problema que ya está experimentando; debe llamarlo al source.

+0

Y ahora que volví a leer la pregunta, probablemente fue una tontería escribirla :-) Oh, bueno. –

+0

+1: Esto es útil cuando el intérprete de comandos ha implementado el comando 'cd' internamente (y también el comando' source' o '.'). AFAICT, la pregunta es sobre un shell de fabricación casera que no implementa 'cd' (mediante la llamada al sistema' chdir() ') y, por lo tanto, ninguna cantidad de fuentes de abastecimiento puede ayudar a cambiar el directorio hasta que lo haga. –

+0

Sí, lo obtuve en el segundo pase de mi analizador mental. –

0

Esto es tan simple como:

  • cd no es una orden.

Prueba esto:

- whereis ls

- whereis cd

(Ver la diferencia)

  • cd es característica de la cáscara, por lo que si usted está haciendo un shell entonces tienes que admitir cd.

veo de esta manera, cuando se ejecuta ls entonces tiene que conocer la PWD. Por lo tanto, es su shell personalizado que manejaría el directorio. Entonces, es el caparazón que tiene que soportar CD.

Creo que me hice claro.

Cuestiones relacionadas