หากต้องการพิมพ์ตัวแปรสภาวะแวดล้อม ไดเร็กทอรีการทำงานปัจจุบัน / ปัจจุบัน$PWD
และคำสั่ง pwd
จะพร้อมใช้งาน ดังนั้นการใช้ทั้งสองอย่างแตกต่างกันอย่างไร หรือสิ่งที่ควรเลือกเพื่อวัตถุประสงค์เฉพาะ?
หากต้องการพิมพ์ตัวแปรสภาวะแวดล้อม ไดเร็กทอรีการทำงานปัจจุบัน / ปัจจุบัน$PWD
และคำสั่ง pwd
จะพร้อมใช้งาน ดังนั้นการใช้ทั้งสองอย่างแตกต่างกันอย่างไร หรือสิ่งที่ควรเลือกเพื่อวัตถุประสงค์เฉพาะ?
คำตอบ:
ขึ้นอยู่กับสิ่งที่คุณทำ ประการแรก$PWD
คือตัวแปรสภาพแวดล้อมและpwd
เป็นเชลล์ในตัวหรือไบนารีจริง:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
ตอนนี้ bash builtin จะพิมพ์ค่าปัจจุบันของ$PWD
เว้นแต่คุณจะใช้-P
ค่าสถานะ ตามที่อธิบายไว้ใน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.
pwd
ไบนารีบนมืออื่น ๆ ที่ได้รับไดเรกทอรีปัจจุบันผ่านสายระบบซึ่งผลตอบแทนคุ้มค่าเช่นเดียวกับgetcwd(3)
readlink -f /proc/self/cwd
หากต้องการแสดงตัวอย่างลองย้ายไปยังไดเรกทอรีที่มีลิงก์ไปยังอีกไดเรกทอรีหนึ่ง:
$ 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
ดังนั้นในการสรุปในระบบ GNU (เช่น Ubuntu) pwd
และecho $PWD
เทียบเท่าเว้นแต่คุณจะใช้-P
ตัวเลือก แต่แตกต่างกันและพฤติกรรมเช่น/bin/pwd
pwd -P
ทั้งสองจะส่งคืนผลลัพธ์เดียวกันถ้าคุณใช้โดยไม่มีตัวเลือกสำหรับไดเรกทอรีการทำงานทั้งหมดรวมถึงเมื่ออยู่ในลิงก์สัญลักษณ์
อย่างไรก็ตามจากman pwd
:
-P, --physical
avoid all symlinks
นี่จะหมายถึงการดำเนินการpwd -P
เมื่ออยู่ในลิงก์สัญลักษณ์ซึ่งชี้ไปยังไดเรกทอรีอื่นบางแห่งจะพิมพ์เส้นทางไปยังไดเรกทอรีเดิม
ตัวอย่างเช่นหากคุณมีลิงก์สัญลักษณ์/var/run
ที่ชี้ไป/run
และคุณอยู่ใน/var/run/
ไดเรกทอรีให้เรียกใช้งาน
echo $PWD
จะกลับมา:
/var/run
pwd
และจะเป็นเหมือนกันสำหรับ อย่างไรก็ตามหากคุณดำเนินการ:
pwd -P
จะกลับมา
/run
ดังนั้นขึ้นอยู่กับเส้นทางที่คุณต้องการ: เส้นทางจริงโดยไม่มีลิงก์สัญลักษณ์หรือไดเรกทอรีปัจจุบันโดยไม่สนใจลิงก์สัญลักษณ์ ข้อแตกต่างระหว่างระหว่างpwd -P
และecho $PWD
คือเมื่อมีลิงก์สัญลักษณ์