Diferencia de uso entre pwd y $ PWD

9

Para imprimir el directorio de trabajo actual / actual, la variable de entorno $PWD y el comando pwd están disponibles. Entonces, ¿cuál es la diferencia en el uso de ambos? o ¿Qué se debe elegir para un propósito específico?

Pandya
fuente

Respuestas:

10

Eso depende de lo que estés haciendo. En primer lugar, $PWDes una variable de entorno y pwdes un shell incorporado o un binario real:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

Ahora, el bash incorporado simplemente imprimirá el valor actual de a $PWDmenos que use la -Pbandera. Como se explica en help pwd:

pwd: pwd [-LP]
Print the name of the current working directory.

Options:
  -L    print the value of $PWD if it names the current working
    directory
  -P    print the physical directory, without any symbolic links

By default, `pwd' behaves as if `-L' were specified.

El pwdbinario, por otro lado, obtiene el directorio actual a través de la getcwd(3)llamada al sistema que devuelve el mismo valor que readlink -f /proc/self/cwd. Para ilustrar, intente moverse a un directorio que sea un enlace a otro:

$ ls -l
total 4
drwxr-xr-x 2 terdon terdon 4096 Jun  4 11:22 foo
lrwxrwxrwx 1 terdon terdon    4 Jun  4 11:22 linktofoo -> foo/
$ cd linktofoo
$ echo $PWD
/home/terdon/foo/linktofoo
$ pwd
/home/terdon/foo/linktofoo
$ /bin/pwd
/home/terdon/foo/foo

Entonces, en conclusión, en sistemas GNU (como Ubuntu), pwdy echo $PWDson equivalentes a menos que use la -Popción pero /bin/pwdsea ​​diferente y se comporte como pwd -P.

terdon
fuente
Una diferencia es que usar $ PWD cuando esté disponible evitará bifurcar un subcomando como echo o pwd. Esto lo hace ventajoso para el rendimiento y el seguimiento del programa.
Joe Atzberger
3

Ambos devolverán el mismo resultado si los usa sin opciones para todos los directorios de trabajo, incluso cuando se encuentran en enlaces simbólicos.

Sin embargo, de man pwd:

-P, --physical
    avoid all symlinks

Esto significaría ejecutar pwd -Pcuando en enlaces simbólicos que apuntan a otros directorios se imprima la ruta al directorio original.

Como ejemplo, si tiene un enlace simbólico /var/runque apunta /runy está actualmente en el /var/run/directorio, ejecutando

echo $PWD

volverá:

/var/run

y será el mismo para pwd. Sin embargo, si ejecuta:

pwd -P

volverá

/run

Por lo tanto, depende de la ruta que necesite: la ruta real sin enlaces simbólicos o el directorio actual que ignora los enlaces simbólicos. La única diferencia entre pwd -Py echo $PWDes cuando hay enlaces simbólicos.

Jobin
fuente