Différence d'utilisation entre pwd et $ PWD

9

Pour imprimer la variable $PWD et la commande d' environnement du répertoire de travail actuel / présent pwdsont disponibles. Alors, quelle est la différence d'utilisation des deux? ou Que faut-il choisir dans un but précis?

Pandya
la source

Réponses:

10

Cela dépend de ce que vous faites. Tout d'abord, $PWDest une variable d'environnement et pwdest un shell intégré ou un binaire réel:

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

Maintenant, la commande bash affichera simplement la valeur actuelle de $PWDsauf si vous utilisez l' -Pindicateur. Comme expliqué dans 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.

Le pwdbinaire, d'autre part, obtient le répertoire en cours via l' getcwd(3)appel système qui renvoie la même valeur que readlink -f /proc/self/cwd. Pour illustrer cela, essayez de vous déplacer dans un répertoire qui est un lien vers un autre:

$ 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

Donc, en conclusion, sur les systèmes GNU (tels que Ubuntu), pwdet echo $PWDsont équivalents, sauf si vous utilisez l' -Poption, mais /bin/pwdest différent et se comporte comme pwd -P.

terdon
la source
Une différence est que l'utilisation de $ PWD lorsqu'il est disponible évitera de bifurquer une sous-commande comme echo ou pwd. Cela le rend avantageux pour les performances et le suivi des programmes.
Joe Atzberger
3

Les deux renverront le même résultat si vous les utilisez sans options pour tous les répertoires de travail, y compris dans les liens symboliques.

Cependant, à partir de man pwd:

-P, --physical
    avoid all symlinks

Cela signifierait que l'exécution pwd -Pdans des liens symboliques qui pointent vers d'autres répertoires affichera le chemin d'accès au répertoire d'origine.

Par exemple, si vous avez un lien symbolique /var/runqui pointe vers /runet que vous êtes actuellement dans le /var/run/répertoire, exécutez

echo $PWD

retournera:

/var/run

et sera le même pour pwd. Cependant, si vous exécutez:

pwd -P

reviendra

/run

Ainsi, cela dépend du chemin dont vous avez besoin: le chemin réel sans liens symboliques ou le répertoire actuel en ignorant les liens symboliques. La seule différence entre pwd -Pet echo $PWDest lorsqu'il existe des liens symboliques.

jobin
la source