2012-05-29 16 views
8

Estoy escribiendo un script de shell que analiza la ruta del directorio de trabajo actual (imprimiendo un me gusta de todos los basenames sobre el directorio actual).

Hasta ahora, he estado utilizando la variable de entorno PWD para analizar el camino pero me pregunto si

  • puedo contar con PWD estar siempre ajustado
  • para producir el mismo resultado en todas las plataformas

¿Sería posible que fuera mejor usar el pwd shell-builtin? Necesito que este script se ejecute en tantas plataformas como sea posible, así que me pregunté ...

Respuesta

13

POSIX requiere $PWD que se fijará de la siguiente manera:

PWD 

Esta variable representa una ruta absoluta del directorio de trabajo actual. No debe contener ningún componente que sea punto o punto-punto. El valor lo establece la utilidad cd y la utilidad sh durante la inicialización.

Así que usted puede confiar en que está establecido – pero no nota "... una ruta absoluta ...", no la ruta absoluta.

bash (al menos las versiones más recientes) recordarán los enlaces simbólicos que siguió al configurar $PWD (y el pwd incorporado). command pwd (es decir, el comando externo) no lo hará. Entonces obtendrás diferentes resultados allí, que podrían o no ser importantes para ti. Use pwd -P si quiere una ruta sin enlaces simbólicos.

tenga en cuenta que la documentación pwd afirma:

si un conjunto de aplicaciones o desarma el valor de las personas con discapacidad, el comportamiento de las personas con discapacidad no se especifica.

Por lo tanto, no hacen eso :)

En pocas palabras, no hay un ganador aquí. La variable de entorno estará allí en los shells POSIX, al igual que el comando externo y posiblemente también un built-in. Elija el que mejor se adapte a sus necesidades, lo importante es si le importan los enlaces simbólicos o no.

+1

[POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pwd.html) también dice: "Si una aplicación establece o desactiva el valor de PWD, el comportamiento de pwd no está especificado". Es posible que desee incluir esto en su respuesta. Se aclara para siempre que ninguna de las dos opciones debe ser "preferida" (excepto dependiendo de si desea o no enlaces simbólicos) – ArjunShankar

+0

Gracias @Arjun, editado en. – Mat

0

Si fuera yo, usaría pwd ya que está integrado tanto para bash como para sh. Eso no significa que funcionen de manera idéntica en todos los aspectos, pero si lo invoca sin opciones, eso no debería importar.

1

Si sabe que bash está disponible y el script se ejecuta con él, PWD es seguro.

Si, en algunos sistemas, solo plain sh está disponible, use pwd.

2

A partir de ese artículo del foro, que se compara "$PWD vs `pwd`" AIX 4.2.1, AIX 6, Sparc Solaris 10 y RedHat 5 empresa con respecto:

  • no hay ninguna diferencia entre $ PWD y PWD orden interna,

  • no hay diferencia entre pwd incorporado -P y/usr/bin/pwd.

El primero muestra el directorio de trabajo con nombres de enlaces simbólicos mientras que el último muestra la ruta real.

La única discrepancia es que el comando externo está en/usr/bin en la mayoría de los sistemas y/bin en Redhat.

Cuestiones relacionadas