¿Cuál es la diferencia entre Unix incorporado en `comando pwd` y de variable de entorno $ PWD?
Pregunta
Este es el caso. Tengo una llamada directorio: - % / Home / myname /
Me hizo un enlace blando en ese directorio: - % Cd / home / myname / % Ln -s / home / otras /.
Ahora, CD en otros / desde / home / myname / Aquí está la parte interesante.
Cuando hice un Unix comando integrado pwd
, me sale el nombre de la ruta original: -
% / Home / otros /
Pero cuando me hago eco de la variable de entorno $ PWD, me sale el nombre de la ruta de enlace: - % / Home / myname / otros /
¿Por qué es así?
Solución
/var# ls -l lrwxrwxrwx 1 root root 10 Aug 22 13:21 mail -> spool/mail drwxr-xr-x 2 root root 4096 Jul 1 20:58 opt drwxr-xr-x 22 root root 4096 Dec 5 17:38 run drwxr-xr-x 12 root root 4096 Aug 22 13:21 spool drwxrwxrwt 14 root root 4096 Dec 6 02:46 tmp /var# cd mail /var/mail# echo $PWD /var/mail /var/mail# pwd /var/mail /var/mail# /bin/pwd /var/spool/mail
En otras palabras, el uso de $PWD
es suficiente, porque no pwd
que podría dar mejores resultados (por cualquier definición de la mejor) de todos modos.
¿Por que es? /bin/pwd
usa llamadas OS-específicas para determinar el directorio de trabajo actual -. y en caso de Linux, el núcleo sólo mantiene el directorio resuelto (ver /proc/self/cwd
), mientras que las personas con discapacidad de la cáscara contienen lo que piensa la cáscara es en
Otros consejos
La diferencia entre el comando externo /bin/pwd
y el built-in es que el comando externo no sabe qué conjunto de operaciones cd
tienes ahí y por lo tanto no pretende que el directorio actual es en algún lugar de una cadena de enlaces simbólicos; que le da el camino directo desde la raíz hasta el directorio actual, en lugar de funcionar realpath()
haría.
Ver set -o physical
en bash
.