Supongamos que tengo una carpeta:
cd /home/cpm135/public_html
y hacer un enlace simbólico
ln -s /var/lib/class .
Más tarde, estoy en ese directorio:
cd /home/cpm135/public_html/class
El pwd
me va a decir que estoy adentro/home/cpm135/public_html/class
¿Hay alguna manera de saber que estoy "realmente" dentro /var/lib/class
? Gracias
shell
symlink
cd-command
working-directory
Oliver Williams
fuente
fuente
fish
shell resuelve automáticamente el enlace simbólico cuando ingresascd
en él.Respuestas:
Dependiendo de cómo
pwd
esté configurado su comando, puede mostrar de manera predeterminada el directorio de trabajo lógico (salida porpwd -L
) que mostrará la ubicación del enlace simbólico, o el directorio de trabajo físico (salida porpwd -P
) que ignora el enlace simbólico y muestra el directorio "real".Para información completa puedes hacer
Dentro de un enlace simbólico, esto devolverá
fuente
-P
bandera era lo que necesitaba. Graciastest "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(o reemplace&& echo No symlinks
con|| echo Symlinks
).file "$(pwd)"
solo funciona si el enlace simbólico es el último componente del directorio. No detecta el enlace simbólico del OP cuando está en CD/home/cpm135/public_html/class/foo/bar
. No conozco nada que imprima información para todos los enlaces simbólicos en un nombre de ruta, pero también puede usarrealpath .
, lo que creo que es equivalente apwd -P
Tenga en cuenta que en
pwd
realidad es un shell incorporado. Dependiendo de su shell y su configuración, los resultados pueden cambiar. Para una solución más portátil, debe usar/bin/pwd
. Fragmento de la página del manual:En general, puede resolver la ruta canónica completa de cualquier archivo / directorio utilizando
readlink -f
.readlink -f .
funciona de forma similar apwd -P
.fuente
readlink -f
no está disponible en todos los Unices (por ejemplo, no está disponible en OS-X)Realmente estás en
/home/cpm135/public_html/class
, esa es la única respuesta correcta a la pregunta "cuál es mi directorio de trabajo actual".Cuando se refiere a
/var/lib/class
... no se trata realmente de dónde se encuentra, sino más bien de qué camino solía llegar allí .Cuando corres
/bin/pwd
, calcula su directorio de trabajo actual mirando el. y ... directorios (los que figuran en la parte superior dels -la
), que determinan con qué directorio ... coincide. y luego trabajando hacia atrás hasta ... y. consulte el mismo directorio. Una vez hecho todo eso, sabe cuál es su directorio de trabajo actual.Cuando ejecuta el
pwd
shell incorporado, no sigue este procedimiento (aunque podría hacer algo si es necesario); en cambio, recuerda el camino que tomó para llegar aquí. Entonces cada vez que haces uncd
comando, tu shell recuerda eso como parte del camino para llegar a donde estás ahora, epwd
imprime lo que ha calculado en función de todos loscd
comandos que has hecho, que pueden o no ser tu directorio de trabajo.Las cosas pueden ponerse realmente extrañas cuando haces
ln -s . foo
y siguescd
en foo:/bin/pwd
dirá que todavía estás en el mismo directorio, pero el shell incorporadopwd
dirá que estás en él/foo/foo/foo/foo/foo/foo
, a pesar de que tal directorio realmente no existe. (Dicho esto, probablemente puedascd
hacerlo).Otra fuente de confusión es si los directorios cambian de nombre.
/bin/pwd
luego recogerá el cambio de inmediato, pero el incorporadopwd
no lo hará hasta que haga algo que le diga que el antiguo nombre del directorio no importa.fuente
pwd
construcción integrada del shell/bin/pwd
y explicar cómo la versión independiente proporciona información más útil (que puede responder a la pregunta original).-P
y-L
opciones mencionadas por otras respuestas. En resumen, algunas implementaciones predeterminadas a una, algunas a la otra. En el sistema Centos que tengo a mano, el valor predeterminado de bash es lógico y/bin/pwd
físico, pero ambos aceptan las dos opciones de línea de comandos y acuerdan el resultado cuando se les da.ls ..
mostrará el contenido de/var/lib
, no/home/cpm135/public_html
.cd ..
es especial: el shell realiza un seguimiento especial de "cómo llegó allí" y en realidad no realiza unachdir("..")
llamada al sistema. En lo que respecta al núcleo, el directorio de trabajo actual de su shell (/proc/self/cwd
) es solo un punto de montaje: par de inodo. Es como un descriptor de archivo abierto en el directorio, por lo que renombrar el directorio no rompe su shell. (cd .
para actualizar la$PWD
variable del shell ). Estás haciendo un punto útil, así que votaría sobre esto cuando esté arregladoBásicamente, está preguntando si hay que mostrar la ruta real del directorio de trabajo actual. Bueno, hay con python y
os.getcwd()
funciónLo que ve a continuación es una pequeña prueba desde el directorio "VirtualBox VMs" ubicado en mi directorio de inicio. En realidad, es un enlace simbólico a un directorio diferente ubicado en un disco duro diferente, montado en
/mnt/HDD
.Como puede ver, Python
os.getcwd()
resuelve la ruta real del directorio, no la ruta del enlace simbólico.fuente