Co to jest $ PWD? (vs bieżący katalog roboczy)

27

Wikipedia ( link ) mówi mi zatem, że polecenie pwdto jest skrótem „drukuj katalog roboczy” i ma to sens.

Ale w przypadku zmiennej środowiskowej „P” musi być akronimem dla czegoś innego niż print.

Słyszę, jak ludzie mówią o „bieżącym katalogu roboczym”, który brzmi lepiej i jest bardziej intuicyjny, ale zmienna środowiskowa wydaje się nazywać $ PWD, a nie $ CWD. Nikt nigdy nie powiedział: „Czy sprawdziłeś zmienną katalogu roboczego drukowania?”.

Obecnie bawię się serwerem aplikacji WWW uWSGI, a gdy go uruchamiam, mówi mi (na stronie statystyk uWSGI):

"cwd":"/home/velle/greendrinks",

więc oczywiście jak (bardziej intuicyjny skrót) cwdpowyżej pwd.

Wydaje mi się, że próbuję dowiedzieć się, czy coś źle zrozumiałem, czy może chodzi tylko o nadanie zmiennej środowiskowej nieintuicyjnej nazwy?

Mads Skjern
źródło
5
Prezentujesz katalog roboczy?
DarioP,
3
Podejrzewam, że po prostu przesadzasz. $PWDjest równoważne `pwd`i to było wystarczające uzasadnienie.
ten drugi facet
1
Kolejne przypuszczenie: Process Working Directory?
oxfn

Odpowiedzi:

23

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]

    Wydrukuj nazwę bieżącego katalogu roboczego.

    Opcje:

      -L
          wypisz wartość $PWD if, jeśli nazwa bieżącego katalogu roboczego
      -P
          wydrukuj katalog fizyczny, bez żadnych dowiązań symbolicznych

    Domyślnie „pwd” zachowuje się tak, jakby podano „-L”.

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/pwdsą inne i zachowują się jak pwd -P.

Źródło /ubuntu//a/476633/291937

Thushi
źródło
1
@llua Nic nie zabrania PWDbyć zmienną środowiskową. W rzeczywistości jest to domyślny przypadek większości, jeśli nie wszystkich powłok, i to ma sens, aby zapewnić go procesom potomnym.
jlliagre,
1
Zastanawiam się, dlaczego ludzie przegłosowali, wydaje się to dobrą odpowiedzią i dokładnie wyjaśniono.
Mads Skjern,
2
@MadsSkjern Większość wbudowanych wymaga standardu POSIX, aby były dostępne również jako polecenia. Pozwala to na wywoływanie ich bezpośrednio z innych programów bez potrzeby uruchamiania powłoki.
jlliagre,
2
To tak naprawdę nie odpowiada mi na pytanie. Pytanie nie dotyczy tak naprawdę różnic między $PWDi pwd(które zostały już wcześniej omówione w U&L), ale powodów, które doprowadziły do ​​nazwania zmiennej „ PWD”.
John WH Smith,
1
@Thushi Masz więcej niż prawdopodobne rację. PWD został wprowadzony przez ksh88który dokument to jako: PWD The present working directory set by the cd command.Powinieneś dodać to do swojej odpowiedzi.
jlliagre,
15

$ PWD jest P athname obecnego W robocze D irectory

Gdy istnieją dowiązania symboliczne, wyniki mogą być różne od odczytania $ PWD do wykonania polecenia pwd .

jcbermu
źródło
Czy możesz podać przykład uzyskania różnych wartości dla $PWDi pwd?
Mads Skjern,