Câu trả lời:
Điều đó phụ thuộc vào những gì bạn đang làm. Trước hết, $PWD
là một biến môi trường và pwd
là một shell dựng sẵn hoặc một nhị phân thực tế:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
Bây giờ, bash dựng sẵn sẽ chỉ in giá trị hiện tại $PWD
trừ khi bạn sử dụng -P
cờ. Như đã giải thích trong 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.
Mặt khác pwd
, nhị phân nhận được thư mục hiện tại thông qua lệnh getcwd(3)
gọi hệ thống trả về cùng giá trị như readlink -f /proc/self/cwd
. Để minh họa, hãy thử di chuyển vào một thư mục là một liên kết đến một thư mục khác:
$ 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
Vì vậy, kết luận, trên các hệ thống GNU (như Ubuntu) pwd
và echo $PWD
tương đương trừ khi bạn sử dụng -P
tùy chọn nhưng /bin/pwd
khác biệt và hoạt động như thế nào pwd -P
.
Cả hai sẽ trả về cùng một kết quả nếu bạn sử dụng chúng mà không có tùy chọn cho tất cả các thư mục làm việc, kể cả khi trong các liên kết tượng trưng.
Tuy nhiên, từ man pwd
:
-P, --physical
avoid all symlinks
Điều này có nghĩa là thực thi pwd -P
khi trong các liên kết tượng trưng trỏ đến một số thư mục khác sẽ in đường dẫn đến thư mục gốc.
Ví dụ: nếu bạn có một liên kết tượng trưng /var/run
trỏ đến /run
và bạn hiện đang ở trong /var/run/
thư mục, thực thi
echo $PWD
sẽ trở lại:
/var/run
và sẽ giống nhau cho pwd
. Tuy nhiên, nếu bạn thực thi:
pwd -P
sẽ trở lại
/run
Do đó, nó phụ thuộc vào đường dẫn bạn yêu cầu: đường dẫn thực tế không có liên kết tượng trưng hoặc thư mục hiện tại bỏ qua các liên kết tượng trưng. Sự khác biệt duy nhất giữa pwd -P
và echo $PWD
là khi có các liên kết tượng trưng.