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?
Respuesta
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.
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
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. –
@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. –
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
.
Y ahora que volví a leer la pregunta, probablemente fue una tontería escribirla :-) Oh, bueno. –
+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. –
Sí, lo obtuve en el segundo pase de mi analizador mental. –
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 admitircd
.
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.
- 1. "cd" no funciona en el script de shell
- 2. Terminal comando cd no funciona desde el guión Scala
- 3. ¿Por qué mi comando send_mail() no funciona en Django?
- 4. personalizando el comando de cd
- 5. ¿Por qué este programa PHP no funciona?
- 6. ¿Por qué no funciona mi mapeo vim?
- 7. No entiendo por qué el comando ForEach no funciona
- 8. ¿Por qué mi strtotime ("hoy") no funciona?
- 9. ¿Por qué mi función CallBack no funciona?
- 10. ¿Por qué mi función toFixed() no funciona?
- 11. ¿Por qué no funciona mi TimeSpan.Add()?
- 12. El comando `timeout` no funciona con Scala, ¿por qué?
- 13. ¿por qué zsh globbing no funciona con el comando find?
- 14. ¿por qué no funciona mi JavaScript .replace()?
- 15. ¿Por qué este comando funciona con os.system() pero no subprocess.Popen()?
- 16. ssh2_exec() no cambiará el directorio con "cd"
- 17. ¿Por qué mi takeWhile no funciona con mi Stream
- 18. exportación no funciona en mi script de shell
- 19. ssh con el comando .... Más el shell
- 20. ¿Por qué mi programa no reconoce rutas mapeadas UNC?
- 21. Ejecutando un comando de shell en un programa c
- 22. ¿Por qué mi programa funciona con una extensión .py pero no con una extensión .pyw?
- 23. ¿Por qué intellisense no funciona en mi objeto ko?
- 24. ¿Por qué mi bloque finalmente no funciona en C#?
- 25. ¿Por qué mi GridSplitter no funciona en absoluto?
- 26. ¿Por qué mi transición CSS3 no funciona en Firefox?
- 27. ¿Por qué mi EmbeddedId en hibernación no funciona?
- 28. ¿Por qué mi selector jQuery: not() no funciona en CSS?
- 29. ¿Por qué mi comando de transmisión falla para el programa básico MapReduce?
- 30. ¿Por qué mi programa de división de C++ no compila
Si el error es "Comando no encontrado", puede ser algo relacionado con "RUTA". ¿Qué dice 'echo $ PATH'? –
¿Has creado tu propio caparazón? Sin un comando 'cd'? ¿Por qué hiciste eso? – Johnsyweb