Comprender los recorridos de enlaces simbólicos del directorio y el directorio padre

9

Digamos que tiene directorios /dir1y /dir2/linked, donde este último es un enlace simbólico al primero.

Cuando cda linkedy pwd, se obtiene la salida /dir2/linked. Si entonces cd .., te pondrán /dir2. Este comportamiento es consistente con el concepto de estar en el /dir2/linkedpasado. Sin embargo, según tengo entendido, el directorio padre ( ..) de cualquier directorio se almacena en el inodo del directorio (es decir, físicamente en el disco). Obviamente, como /dir2/linkedes realmente /dir1, el directorio padre en el inodo debe ser/

Para complicar aún más las cosas, dentro /dir2/linked, las salidas de ls ..y cd .. ; ls .son diferentes. Parece que cdhonra la ruta de enlace simbólico, mientras que lshonra la ruta "física". Sin embargo, como se menciona en esta pregunta , hay cd -Ppara este caso de uso.

man pwd menciona directorios de trabajo "físicos" y "lógicos", pero todavía tengo algunas preguntas en este punto:

  • ¿Es este comportamiento siempre proporcionado por la PWDvariable de entorno, como se menciona en man pwd?
  • ¿Por qué usar valores predeterminados cdy lstener comportamientos diferentes, si ambos son comandos de shell (es decir, no programas)?
  • ¿ Utiliza el programa típico (no el comando de shell) en PWDlugar de la ruta física? Me doy cuenta de que depende de la implementación, pero ¿hay alguna regla general?
goncalopp
fuente
1
Mucha información en esta respuesta
Stéphane Chazelas
1
@ StéphaneChazelas Esa es una respuesta fantástica, gracias por compartirla
goncalopp
De nada. Siéntase libre de copiar y pegar el texto desde allí si planea dar su propia respuesta a su propia pregunta.
Stéphane Chazelas

Respuestas:

5

bash "sabe" sobre enlaces simbólicos y rastrea esta información cuando usa un enlace simbólico para ingresar a un directorio.

Puede verificar esto haciendo lo siguiente en su ejemplo:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

Debe comenzar el bash con una PWDvariable vacía , de lo contrario, utiliza ese truco para mostrar la ruta "falsa".

Tenga en cuenta que ls es un programa separado y, como tal, no tiene el conocimiento de bash de cómo llegó al directorio actual, por ls ..lo que solo mostrará el contenido del directorio principal real , no en relación con el enlace simbólico que siguió.

La mayoría de los programas no dependerán de la variable de entorno, CWDya que hay muchas formas de iniciar programas, a través del shell bash es solo uno, por lo que no es confiable esperar CWDque contenga el valor correcto (intente configurar CWDalgo incorrecto antes de hacerlo bash -c pwd, puede ver que verifica El valor para la cordura).

wurtel
fuente
es útil saber que se borre PWDcomo tal, pero por sí mismo esto no responde a las preguntas que he mencionado
goncalopp
Se agregó más información.
wurtel
Tenía la impresión lsde que bash helpme había proporcionado, pero tú y tú me convenciste de lo contrario. Eso hace las cosas mucho más claras, ¡gracias!
goncalopp
PWDes estándar en POSIX. Puede confiar en que se establezca. Si no está configurado, las cosas podrían romperse, por ejemplo, la pwd utilidad : Consulte también Variables de entorno .
darkfeline