Digamos que tiene directorios /dir1
y /dir2/linked
, donde este último es un enlace simbólico al primero.
Cuando cd
a linked
y 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/linked
pasado. 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/linked
es 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 cd
honra la ruta de enlace simbólico, mientras que ls
honra la ruta "física". Sin embargo, como se menciona en esta pregunta , hay cd -P
para 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
PWD
variable de entorno, como se menciona enman pwd
? - ¿Por qué usar valores predeterminados
cd
yls
tener comportamientos diferentes, si ambos son comandos de shell (es decir, no programas)? - ¿ Utiliza el programa típico (no el comando de shell) en
PWD
lugar de la ruta física? Me doy cuenta de que depende de la implementación, pero ¿hay alguna regla general?
fuente
Respuestas:
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:
Debe comenzar el bash con una
PWD
variable 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, porls ..
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,
CWD
ya que hay muchas formas de iniciar programas, a través del shell bash es solo uno, por lo que no es confiable esperarCWD
que contenga el valor correcto (intente configurarCWD
algo incorrecto antes de hacerlobash -c pwd
, puede ver que verifica El valor para la cordura).fuente
PWD
como tal, pero por sí mismo esto no responde a las preguntas que he mencionadols
de que bashhelp
me había proporcionado, pero tú y tú me convenciste de lo contrario. Eso hace las cosas mucho más claras, ¡gracias!PWD
es estándar en POSIX. Puede confiar en que se establezca. Si no está configurado, las cosas podrían romperse, por ejemplo, lapwd
utilidad : Consulte también Variables de entorno .