ฉันเพิ่ม symlink ln -s . aa
ไปยังไดเรกทอรีปัจจุบันด้วย ถ้าผมดำเนินการcd aa
และหลังจากที่ผมดำเนินการตอบสนองคือpwd
/home/sim/aa
แต่ถ้าฉันรัน/bin/pwd
มันจะพิมพ์/home/sim
(ไดเรกทอรีปัจจุบันไม่เปลี่ยนแปลง)
ความแตกต่างนี้มาจากไหน?
ฉันเพิ่ม symlink ln -s . aa
ไปยังไดเรกทอรีปัจจุบันด้วย ถ้าผมดำเนินการcd aa
และหลังจากที่ผมดำเนินการตอบสนองคือpwd
/home/sim/aa
แต่ถ้าฉันรัน/bin/pwd
มันจะพิมพ์/home/sim
(ไดเรกทอรีปัจจุบันไม่เปลี่ยนแปลง)
ความแตกต่างนี้มาจากไหน?
คำตอบ:
ในเชลล์ส่วนใหญ่รวมถึง bash pwd
คือเชลล์บิวด์อิน:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
หากคุณใช้/bin/pwd
คุณต้องใช้-L
ตัวเลือกเพื่อให้ได้ผลลัพธ์เช่นเดียวกับ builtin pwd
:
$ ln -s . test
$ cd test && pwd
/home/cuonglm/test
$ /bin/pwd
/home/cuonglm
$ /bin/pwd -L
/home/cuonglm/test
โดยค่าเริ่มต้น/bin/pwd
ละเว้นลิงค์และพิมพ์ไดเรกทอรีจริง
จากinfo pwd
:
`-L'
`--logical'
If the contents of the environment variable `PWD' provide an
absolute name of the current directory with no `.' or `..'
components, but possibly with symbolic links, then output those
contents. Otherwise, fall back to default `-P' handling.
`-P'
`--physical'
Print a fully resolved name for the current directory. That is,
all components of the printed name will be actual directory
names--none will be symbolic links.
บิวด์อินpwd
รวม symlink โดยค่าเริ่มต้นยกเว้น-P
ตัวเลือกที่ใช้หรือ-o physical
ตั้งค่า builtin
จากman bash
:
pwd [-LP]
Print the absolute pathname of the current working directory.
The pathname printed contains no symbolic links if the -P option
is supplied or the -o physical option to the set builtin command
is enabled. If the -L option is used, the pathname printed may
contain symbolic links. The return status is 0 unless an error
occurs while reading the name of the current directory or an
invalid option is supplied.
/bin/pwd
ละเว้น symlink โดยค่าเริ่มต้นอ่านส่วนหนึ่งinfo pwd
ในคำตอบของฉัน: พิมพ์ชื่อที่ได้รับการแก้ไขอย่างสมบูรณ์สำหรับไดเรกทอรีปัจจุบัน นั่นคือส่วนประกอบทั้งหมดของชื่อที่พิมพ์จะเป็นชื่อไดเรกทอรีจริง - ไม่มีจะเป็นลิงก์สัญลักษณ์
set -o physical
ตอนนี้pwd
ใช้-P
ตัวเลือกโดยปริยายถ้าคุณไม่มี-L
ตัวเลือกคุณจะพิมพ์เส้นทางที่มี symlink ได้อย่างไร อ่านสิ่งนี้https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
เพื่อทราบว่าset -o physical
ทำอะไร
เป็นไปได้ที่กระบวนการซักถามระบบไฟล์เพื่อกำหนดไดเรกทอรีการทำงานปัจจุบันโดยใช้วิธีที่ซับซ้อนเกินกว่าจะเป็นหัวข้อเพื่อตอบคำถามนี้ นี่คือสิ่งที่pwd
โปรแกรมและgetcwd
ฟังก์ชั่นห้องสมุดทำ ในยุคแรก ๆ ของ Unix พวกเขาเป็นวิธีเดียวที่จะค้นหาว่าไดเรกทอรีการทำงานของคุณคืออะไร นี่คือส่วนหนึ่งของคำตอบสำหรับคำถามของคุณที่ฉันไม่สามารถหาได้จากคำตอบอื่น ๆ หรือแม้แต่ที่อื่นบนไซต์นี้ (หลังจากการค้นหา 42 วินาที):
getcwd
)หลังจากนั้นทุกครั้งที่คุณทำ a cd
, pushd
หรือpopd
, เชลล์จะติดตามไดเร็กทอรีทำงานโดยใช้ฟังก์ชันการจัดการสตริง ตัวอย่างเช่น,
/home/sim
และคุณพิมพ์cd ..
เชลล์จะคำนวณว่าไดเร็กทอรีการทำงานของคุณคือ/home
อะไร/home/sim
และคุณพิมพ์cd .
เชลล์จะคำนวณว่าไดเร็กทอรีการทำงานของคุณยังคง/home/sim
อยู่/home/sim
และคุณพิมพ์cd aa
เชลล์จะคำนวณว่าไดเร็กทอรีการทำงานของคุณคือ/home/sim/aa
- โดยไม่ตรวจสอบเพื่อดูว่าaa
เป็นลิงก์สัญลักษณ์หรือไม่มันไม่นี้เพื่อบันทึก“ค่าใช้จ่าย” getcwd
ของการโทร แต่นี่เป็นการแลกเปลี่ยนเนื่องจากอาจส่งผลให้ข้อมูลไม่ถูกต้อง
pwd
(ในตัว) คำสั่งเพียงแค่แสดงเปลือกจำ / คำนวณความคิดของสิ่งที่ไดเรกทอรีการทำงานคือดังนั้นสิ่งที่สำคัญที่สุดคือเปลือกสามารถสับสนได้ว่ามันอยู่ตรงไหน แต่ถ้าคุณพิมพ์/bin/pwd
สิ่งนั้นจะทำงานในกระบวนการที่แยกต่างหากซึ่งไม่สามารถเข้าถึงความคิดของเชลล์เกี่ยวกับไดเร็กตอรี่ที่ใช้งานอยู่และดังนั้นมันจึงเป็นตัวกำหนดไดเร็คทอรี่สำหรับการทำงานที่แท้จริง (ข้อยกเว้น: /bin/pwd
โปรแกรมสามารถดูตัวแปรสภาพแวดล้อม PWD และเห็นได้ชัดว่ามันทำเมื่อคุณระบุ-L
) นี่เป็นอีกตัวอย่างของวิธีที่เชลล์สามารถสับสน:
cd /home/sim/aa #
สมมติว่า/home
,/home/sim
และ/home/sim/aa
#
เป็นไดเรกทอรีจริงทั้งหมด (ไม่ใช่ลิงก์สัญลักษณ์)
pwd #
ผลลัพธ์:/home/sim/aa
ซึ่งถูกต้อง
mv ../aa ../bb
pwd #
ผลลัพธ์:/home/sim/aa
ซึ่งไม่ถูกต้อง
/bin/pwd #
ผลลัพธ์:/home/sim/bb
ซึ่งถูกต้อง
และเพียงในกรณีที่คุณไม่ชัดเจนเกี่ยวกับเรื่องนี้ถ้าคุณพิมพ์ln -s . aa
และcd aa
แล้วไดเรกทอรีการทำงานปัจจุบันของคุณไม่ได้เปลี่ยนแปลงใด ๆ มากกว่ามันไม่เมื่อคุณพิมพ์cd .
- cd aa
เพราะที่เป็นหลักสิ่งที่คุณทำเมื่อคุณพิมพ์
-L
กว่าการประหยัดค่าใช้จ่าย - และ$PWD
เป็นตัวแปรสภาพแวดล้อมที่ผู้ใช้กำหนด POSIX ระบุ - การใช้งานผู้ใช้พื้นที่อาจจะไว้วางใจได้ (? สิ่งที่หมายถึง ... ) อย่างไรก็ตามในขณะที่ฉันไม่ได้เป็นแฟนของ symlink มันเป็นสิทธิพิเศษของผู้ใช้ไปทางอ้อมในทิศทางที่บ้าคลั่งมากที่สุดเท่าที่เขาหรือเธอควรเลือกกับพวกเขา - และนั่นคือสิ่งที่-L
เป็นอะไรมากกว่าอะไร