Apa itu $ PWD? (vs direktori kerja saat ini)

27

Jadi Wikipedia ( tautan ) memberi tahu saya bahwa perintah tersebut pwdadalah kependekan dari "print working directory", dan itu masuk akal.

Tetapi untuk variabel lingkungan, "P" harus menjadi akronim untuk sesuatu selain cetak.

Saya mendengar orang berbicara tentang "direktori kerja saat ini", yang terdengar lebih baik dan lebih intuitif, tetapi masih variabel lingkungan tampaknya disebut $ PWD, dan bukan $ CWD. Tidak ada yang pernah mengatakan "Apakah Anda memeriksa variabel direktori kerja cetak?".

Saat ini saya bermain-main dengan server aplikasi web uWSGI, dan ketika menjalankannya memberitahu saya (di halaman statistik uWSGI):

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

jadi mereka jelas suka (akronim lebih intuitif) cwdlebih pwd.

Saya kira saya mencoba mencari tahu apakah saya salah mengerti sesuatu, atau apakah itu hanya masalah memberikan variabel lingkungan nama yang tidak intuitif?

Mads Skjern
sumber
5
Direktori Kerja Sekarang?
DarioP
3
Saya curiga Anda hanya terlalu memikirkannya. $PWDsetara dengan `pwd`, dan itu cukup pembenaran.
pria lain itu
1
Tebakan lain: Proses Direktori Kerja?
oxfn

Jawaban:

23

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]

    Cetak nama direktori kerja saat ini.

    Pilihan:

      -L
          cetak nilai $PWD jika nama direktori kerja saat ini
      -P
          cetak direktori fisik, tanpa tautan simbolik

    Secara default, 'pwd' berperilaku seolah-olah '-L' ditentukan.

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.

Sumber /ubuntu//a/476633/291937

Thushi
sumber
1
@llua Tidak ada yang melarang PWDmenjadi variabel lingkungan. Ini sebenarnya adalah kasus default dengan kebanyakan jika tidak semua shell dan itu masuk akal untuk memberikannya kepada proses anak-anak.
jlliagre
1
Saya bertanya-tanya mengapa orang downvoting, sepertinya jawaban yang bagus, dan dijelaskan dengan seksama.
Mads Skjern
2
@MadsSkjern Kebanyakan builtin diperlukan oleh standar POSIX agar juga tersedia sebagai perintah. Ini untuk memungkinkan memanggil mereka secara langsung dari program lain tanpa perlu meluncurkan shell.
jlliagre
2
Ini tidak benar-benar menjawab pertanyaan kepada saya. Pertanyaannya sebenarnya bukan tentang perbedaan antara $PWDdan pwd(yang telah dibahas pada U&L sebelum saya percaya), tetapi tentang alasan yang menyebabkan penamaan variabel " PWD".
John WH Smith
1
@ Thushi Anda kemungkinan besar benar. PWD diperkenalkan oleh ksh88dokumen mana itu sebagai: PWD The present working directory set by the cd command.Anda harus menambahkan ini ke balasan Anda.
jlliagre
15

$ PWD adalah P athname arus W Mengurai D irectory

Ketika ada tautan simbolis bisa jadi hasil yang berbeda dari membaca $ PWD hingga mengeksekusi perintah pwd .

jcbermu
sumber
Bisakah Anda memberikan contoh cara mendapatkan nilai berbeda untuk $PWDdan pwd?
Mads Skjern