Perbedaan Penggunaan antara pwd dan $ PWD

9

Untuk mencetak variabel $PWD dan perintah lingkungan direktori kerja saat ini / sekarang pwdtersedia. Jadi, apa perbedaan penggunaan keduanya? atau Apa yang harus dipilih untuk tujuan tertentu?

Pandya
sumber

Jawaban:

10

Itu tergantung pada apa yang Anda lakukan. Pertama-tama, $PWDadalah variabel lingkungan dan pwdmerupakan shell builtin atau biner aktual:

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

Sekarang, bash builtin hanya akan mencetak nilai saat ini $PWDkecuali Anda menggunakan -Pbendera. Sebagaimana dijelaskan dalam 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.

The pwdbiner, di sisi lain, mendapat direktori saat ini melalui getcwd(3)system call yang mengembalikan nilai yang sama seperti readlink -f /proc/self/cwd. Untuk mengilustrasikan, coba pindah ke direktori yang merupakan tautan ke yang lain:

$ 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

Jadi, sebagai kesimpulan, pada sistem GNU (seperti Ubuntu), pwddan echo $PWDsama kecuali Anda menggunakan -Popsi tetapi /bin/pwdberbeda dan berperilaku seperti pwd -P.

terdon
sumber
Satu perbedaan adalah bahwa menggunakan $ PWD ketika tersedia akan menghindari forking subcomand seperti echo atau pwd. Ini membuatnya menguntungkan untuk penelusuran kinerja dan program.
Joe Atzberger
3

Keduanya akan mengembalikan hasil yang sama jika Anda menggunakannya tanpa opsi untuk semua direktori yang berfungsi, termasuk ketika di tautan simbolis.

Namun, dari man pwd:

-P, --physical
    avoid all symlinks

Ini berarti mengeksekusi pwd -Pketika dalam tautan simbolik yang menunjuk ke beberapa direktori lain yang akan mencetak path ke direktori asli.

Sebagai contoh, jika Anda memiliki tautan simbolis /var/runyang mengarah ke /rundan Anda saat ini dalam /var/run/direktori, mengeksekusi

echo $PWD

akan kembali:

/var/run

dan akan sama untuk pwd. Namun, jika Anda menjalankan:

pwd -P

akan kembali

/run

Jadi, itu tergantung jalur mana yang Anda perlukan: jalur aktual tanpa tautan simbolik atau direktori saat ini yang mengabaikan tautan simbolik. Satu-satunya perbedaan antara pwd -Pdan echo $PWDadalah ketika ada tautan simbolik.

pekerjaan
sumber