Różnica w użyciu między pwd a $ PWD


9

Aby wydrukować bieżący / obecny katalog roboczy, dostępna jest zmienna środowiskowa $PWD i komenda pwd . Jaka jest różnica w użyciu obu? lub Co wybrać na konkretny cel?

Odpowiedzi:


10

To zależy od tego, co robisz. Przede wszystkim $PWDjest zmienną środowiskową i pwdjest wbudowaną powłoką lub rzeczywistym plikiem binarnym:

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

Teraz wbudowane bash wypisze po prostu bieżącą wartość, $PWDchyba że użyjesz -Pflagi. Jak wyjaśniono w 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.

pwdBinarny, z drugiej strony, staje się aktualny katalog poprzez getcwd(3)wywołanie systemowe która zwraca taką samą wartość jak readlink -f /proc/self/cwd. Aby to zilustrować, spróbuj przejść do katalogu, który jest linkiem do innego:

$ 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

Podsumowując, w systemach GNU (takich jak Ubuntu) pwdi echo $PWDsą równoważne, chyba że użyjesz tej -Popcji, ale /bin/pwdjest inna i zachowuje się jak pwd -P.


Jedną różnicą jest to, że użycie $ PWD, gdy jest dostępne, pozwoli uniknąć rozwidlania podkomendy, takiej jak echo lub pwd. To sprawia, że ​​jest to korzystne dla wydajności i śledzenia programu.
Joe Atzberger

3

Oba zwrócą ten sam wynik, jeśli użyjesz ich bez opcji dla wszystkich działających katalogów, w tym w przypadku dowiązań symbolicznych.

Jednak z man pwd:

-P, --physical
    avoid all symlinks

Oznaczałoby to wykonanie, pwd -Pgdy w dowiązaniach symbolicznych, które wskazują na niektóre inne katalogi, wydrukuje ścieżkę do oryginalnego katalogu.

Na przykład, jeśli masz dowiązanie symboliczne, /var/runktóre wskazuje /runi znajdujesz się w /var/run/katalogu, wykonywanie

echo $PWD

wróci:

/var/run

i będzie to samo dla pwd. Jeśli jednak wykonasz:

pwd -P

wróci

/run

Zatem zależy to od ścieżki, której potrzebujesz: rzeczywista ścieżka bez dowiązań symbolicznych lub obecny katalog ignorujący dowiązania symboliczne. Jedyna różnica między pwd -Pi echo $PWDwystępuje, gdy istnieją dowiązania symboliczne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.