Siempre me he preguntado por qué cd
no es un programa, pero nunca logré encontrar la respuesta.
Alguien sabe por qué este es el caso?
shell
command
cd-command
shell-builtin
AkshaiShah
fuente
fuente
cd
comando original de Unix era un programa separado. El caparazón lo manejó especialmente porque no lo hizofork
, soloexec
. Y cuandocd
terminara, se ejecutaríash
. No sé si esta es una historia real.chdir
syscall. fuentes: v1 v5 v7 (primera versión con Bourne shell)cd
eso que había leído. Estaba claramente equivocado sobre el aspecto, ahora que @jlliagre ha completado los detalles.Respuestas:
El
cd
comando modifica el "directorio de trabajo actual", ¿verdad?El "directorio de trabajo actual" es una propiedad exclusiva de cada proceso.
Entonces, si
cd
fuera un programa, funcionaría así:cd foo
cd
proceso comienzacd
proceso cambia el directorio para el proceso de cdcd
proceso salefuente
cd
fuera un programa funcionaría así" debería ser "cuandocd
se utiliza en la implementación de su programa externo, funciona así".cd
Además de ser un shell integrado, en realidad también es un programa en sistemas operativos compatibles con POSIX. Ellos deben proporcionar ejecutables independientes para los servicios públicos regulares, comocd
. Este es por ejemplo el caso con Solaris , AIX , HP-UX y OS X .Obviamente, un builtin
cd
sigue siendo obligatorio ya que su implementación externa no cambia el directorio actual del shell. Sin embargo, este último todavía puede ser útil. Aquí hay un ejemplo que muestra cómo POSIX imagina cómo secd
podría usar este comando:En un sistema POSIX, este oneliner informará un mensaje de error para todos los directorios en los que no está permitido
cd
. Sin embargo, en la mayoría de las distribuciones de Gnu / Linux, falla con ese mensaje de error:Y aquí está la respuesta a su pregunta, " ¿Por qué cd no es un programa? " Por uno de los coautores originales de Unix. En una implementación muy temprana de Unix,
cd
(escritochdir
en ese momento) era un programa externo. Simplemente dejó de funcionar inesperadamente después de quefork
se implementó por primera vez.Citando a Dennis Ritchie :
Fuente: Dennis M. Ritchie, " La evolución del sistema de tiempo compartido Unix ", AT&T Bell Laboratories Technical Journal 63 (6), Parte 2, octubre de 1984, págs. 1577–93
La página de manual de chdir de Unix Versión 1 (marzo de 1971) dice:
Debido a que se crea un nuevo proceso para ejecutar cada comando, chdir sería ineficaz si se escribiera como un comando normal. Por lo tanto, es reconocido y ejecutado por Shell.
fuente
cd
ejecutable independiente , pero que no haga nada (excepto posiblemente emitir mensajes de error si se llama con los argumentos incorrectos). Extraño.De la introducción de Bash ( ¿Qué es un shell? ):
fuente
Para April Fool's este año, escribí una versión independiente de
cd
.Nadie entendió el chiste. Suspiro.
Cualquiera que no esté seguro de que
cd
debe integrarse en el shell debe descargarlo, compilarlo y probarlo.Lea también su página de manual. :)
fuente
/bin/cd
. Si desea tomar mi código y hacer que sea su propia búsqueda personal, puede hacerlo.El
cd
comando en shell no puede ser un proceso separado porque en Unix no hay ningún mecanismo para cambiar el directorio de trabajo actual de un proceso diferente (ni siquiera el proceso padre).Si
cd
se tratara de un proceso diferente, entonces tendría que cambiar el directorio de trabajo actual de su padre (shell) que no es posible en Unix. En cambio,cd
es un comando especial incorporado. El shell llama a funcioneschdir()
yfchdir()
cambia su propio directorio de trabajo actual.Nota: el núcleo almacena el número de inodo del directorio de trabajo actual para cada proceso. El proceso hijo lo hereda
cwd
de su padre.fuente
cd es un comando de shell incorporado. Tan fácil como es. El cd del hombre lo dice todo. El comando cd cambia el directorio de trabajo para todos los intérpretes y (en un entorno de subprocesos) todos los subprocesos.
fuente
cd
está incorporada. Le sugiero que lea las respuestas mejor calificadas y considere cómo se puede mejorar su respuesta.Creo que una cosa que falta en la respuesta de la gente es que el directorio actual es una variable de entorno que cada programa puede cambiar. Si usa el comando 'exportar' para ver su lista actual de variables de entorno, tendrá:
en sus resultados Por lo tanto, mediante el comando 'cd' solo queremos modificar esta variable interna. Creo que si lo intentamos, podemos cambiar la variable PWD de cualquier pty en shell, por supuesto. Me gusta:
Pero creo que no hay necesidad en casos normales. En otras palabras, tomamos ayuda de bash (o cualquier shell) para modificar su variable interna definida.
fuente
..
camino, no el camino desde el que lo inició:#include <stdlib.h>
int main(void) { chdir(".."); puts(getenv("PWD")); }
(C shells exponen el CWD como% cwd en cambio, por cierto.)#include <unistd.h>
int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); }
No mostrará el directorio desde el que inició el programa/
.$PWD
solo tiene sentido para el shell Bourne. Es solo una forma de que el shell comunique algo que sabe a los scripts de shell para que no tengan que llamarpwd
para encontrarlo. Cualquier programa independiente que dependa del valor de$PWD
no será confiable.