ฉันจะทราบได้อย่างไรว่าฉันอยู่ในตำแหน่ง symlink จากบรรทัดคำสั่ง


33

สมมติว่าฉันมีโฟลเดอร์:

cd /home/cpm135/public_html

และสร้างลิงก์สัญลักษณ์

ln -s /var/lib/class .

ต่อมาฉันอยู่ในไดเรกทอรีนั้น:

cd /home/cpm135/public_html/class

pwdจะบอกฉันฉันอยู่ใน/home/cpm135/public_html/class

มีวิธีใดบ้างที่จะรู้ว่าฉันเป็น "จริง ๆ " เข้าไป/var/lib/class? ขอบคุณ



1
กระสุนบางตัวไม่อนุญาตให้คุณอยู่ใน symlink ตัวอย่างเช่นfishเชลล์จะแก้ไข symlink โดยอัตโนมัติเมื่อคุณcdเข้าไป
trysis

คำตอบ:


56

ขึ้นอยู่กับวิธีการpwdกำหนดค่าคำสั่งของคุณมันอาจเริ่มต้นที่จะแสดงไดเรกทอรีทำงานตรรกะ (output by pwd -L) ซึ่งจะแสดงตำแหน่ง symlink หรือไดเรกทอรีทำงานทางกายภาพ (output by pwd -P) ซึ่งละเว้น symlink และแสดงไดเรกทอรี "จริง"

สำหรับข้อมูลที่สมบูรณ์คุณสามารถทำได้

file "$(pwd -L)"

ภายใน symlink สิ่งนี้จะกลับมา

/path/of/symlink: symbolic link to /path/of/real/directory

1
ใช่-Pธงเป็นสิ่งที่ฉันต้องการ ขอบคุณ
Oliver Williams

6
หากต้องการตอบคำถามในหัวเรื่องให้ใช้test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(หรือแทนที่&& echo No symlinksด้วย|| echo Symlinks)
CVN

1
นี่ตอบคำถามได้อย่างสมบูรณ์แบบโดยไม่จำเป็นต้องเสียงก้อง หากคำถามคือ 'ฉันจะแสดงข้อความได้อย่างไรถ้าฉันอยู่ในไดเรกทอรี symlinked? "จากนั้นจะต้องสะท้อน
Arronical

file "$(pwd)"ใช้งานได้ก็ต่อเมื่อ symlink เป็นองค์ประกอบไดเรกทอรีสุดท้าย มันไม่ได้ตรวจสอบ symlink OP เมื่อ CDed /home/cpm135/public_html/class/foo/barไป ฉันไม่ทราบว่ามีอะไรที่พิมพ์ข้อมูลสำหรับ symlink ทั้งหมดในชื่อพา ธ แต่คุณสามารถใช้realpath .ซึ่งฉันคิดว่าเทียบเท่ากับpwd -P
Peter Cordes

17

โปรดทราบว่าpwdจริง ๆ แล้วเป็นเชลล์ในตัว ผลลัพธ์อาจเปลี่ยนแปลงได้ขึ้นอยู่กับเชลล์และการกำหนดค่า /bin/pwdสำหรับการแก้ปัญหาแบบพกพามากขึ้นคุณควรใช้ ตัวอย่างจากหน้าคู่มือ:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

โดยทั่วไปแล้วคุณสามารถแก้ไขเส้นทางที่เป็นที่ยอมรับอย่างเต็มรูปแบบของไฟล์ใด ๆ / readlink -fไดเรกทอรีใช้ ทำงานเพื่อที่คล้ายกันreadlink -f .pwd -P


2
แม้ว่าฉันได้เรียนรู้วิธีที่ยากที่readlink -fไม่สามารถใช้ได้กับ Unices ทั้งหมด (เช่นไม่มีใน OS-X)
abligh

3

คุณอยู่ใน/home/cpm135/public_html/class- นั่นคือคำตอบที่ถูกต้องสำหรับคำถามของ "สิ่งที่ไดเรกทอรีการทำงานปัจจุบันของฉัน"

เมื่อคุณอ้างถึง/var/lib/class... นั่นไม่ได้เกี่ยวกับว่าคุณอยู่ที่ไหน แต่เป็นเรื่องเพิ่มเติมสิ่งที่เส้นทางที่คุณใช้ในการได้รับมี

เมื่อคุณวิ่ง /bin/pwdมันจะระบุไดเรกทอรีการทำงานปัจจุบันของคุณโดยดูที่ และ .. ไดเรคทอรี่ (รายการที่อยู่ด้านบนของls -la), หาว่าไดเรกทอรีใดใน .. ตรงกับ และทำงานย้อนกลับไปจนถึง .. และ อ้างถึงไดเรกทอรีเดียวกัน เมื่อเสร็จสิ้นทั้งหมดแล้วมันจะรู้ว่าไดเรกทอรีทำงานปัจจุบันของคุณคืออะไร

เมื่อคุณรันpwdเชลล์ในตัวมันจะไม่ทำตามโพรซีเดอร์นี้ (แม้ว่ามันอาจทำบางอย่างถ้าจำเป็น) - แต่มันจะจำพา ธ ที่คุณพามาที่นี่ ดังนั้นทุกครั้งที่คุณทำcdคำสั่งเชลล์ของคุณจะจำได้ว่าเป็นส่วนหนึ่งของเส้นทางที่จะไปถึงที่ที่คุณอยู่ตอนนี้และpwdพิมพ์สิ่งที่cdคำสั่งคำนวณตามคำสั่งทั้งหมดที่คุณทำซึ่งอาจเป็นหรือไม่ใช่ของจริงก็ได้ ไดเรกทอรีทำงาน

สิ่งต่าง ๆ อาจดูแปลกประหลาดจริงๆเมื่อคุณทำ a ln -s . fooและคอยcdจดจ่ออยู่กับ foo - /bin/pwdจะบอกว่าคุณยังอยู่ในไดเรกทอรีเดียวกัน แต่ shell builtin pwdจะบอกว่าคุณอยู่ในนั้น/foo/foo/foo/foo/foo/foo- แม้ว่าจะไม่มีไดเรกทอรีดังกล่าวอยู่จริง (ที่กล่าวว่า - คุณอาจจะสามารถ cdเข้าไปในมัน.)

แหล่งที่มาของความสับสนอีกอย่างคือถ้ามีการเปลี่ยนชื่อไดเรกทอรี /bin/pwdจะรับการเปลี่ยนแปลงทันที แต่ในตัวเครื่องpwdจะไม่ทำงานจนกว่าคุณจะทำสิ่งที่บอกว่าชื่อไดเรกทอรีเก่าไม่สำคัญ


1
คุณไม่ได้ตอบคำถามคุณกำลังปฏิเสธมัน
Dmitry Grigoryev

4
แม้ว่าสิ่งนี้จะไม่ตอบคำถามโดยตรงแต่ฉันคิดว่ามันเป็นโพสต์ที่มีประโยชน์สำหรับการทำความเข้าใจความแตกต่างระหว่างเชลล์ในpwdตัว/bin/pwdและอธิบายว่ารุ่นสแตนด์อะโลนให้ข้อมูลที่มีประโยชน์มากขึ้นได้อย่างไร (ซึ่งสามารถตอบคำถามเดิมได้)
Anthony G - ความยุติธรรมสำหรับ Monica

1
ความแตกต่างเหล่านี้ล้วนเป็นตัวเลือก-Pและ-Lคำตอบอื่น ๆ ในระยะสั้นการใช้งานบางอย่างเริ่มต้นที่หนึ่งบางคนอื่น ๆ ในระบบ Centos ฉันต้องส่งมอบ, builtin ของ bash จะเริ่มต้นเป็นลอจิคัล, และ/bin/pwdเป็น defaulting ทางกายภาพ, แต่ทั้งสองยอมรับทั้งตัวเลือกบรรทัดคำสั่งและยอมรับผลเมื่อพวกเขาได้รับ
IMSoP

1
คำถามขึ้นอยู่กับหลักฐานที่ไม่ถูกต้อง - 'มีวิธีใดบ้างที่จะรู้ว่าฉัน "จริงๆ" ใน / var / lib / class?' ที่กล่าวว่า ... โดยการอธิบายความหมายที่แท้จริงมันช่วยให้เขาเข้าใจในสิ่งที่เขากำลังมองหา pwd -P และ -L ตัวเลือกที่ได้รับการกล่าวถึง ...
dougmc

1
คุณมีข้อโต้แย้งของคุณย้อนหลัง ls ..จะแสดงเนื้อหาของไม่ได้/var/lib /home/cpm135/public_html cd ..เป็นพิเศษ: เชลล์ทำการติดตามพิเศษของ "วิธีที่คุณไปที่นั่น" และไม่ได้ทำการchdir("..")เรียกระบบ เท่าที่เคอร์เนลเกี่ยวข้องไดเรกทอรีทำงานปัจจุบันของเชลล์ ( /proc/self/cwd) ของคุณเป็นเพียงจุดเชื่อมต่อ: inode pair มันเหมือนกับตัวอธิบายไฟล์แบบเปิดในไดเรกทอรีซึ่งเป็นสาเหตุที่การเปลี่ยนชื่อไดเรกทอรีไม่ทำให้เชลล์ของคุณแตก ( cd .เพื่ออัปเดต$PWDตัวแปรของเชลล์) คุณกำลังทำประเด็นที่มีประโยชน์ดังนั้นฉันจะลงคะแนนเมื่อแก้ไขแล้ว
Peter Cordes

1

เป็นหลักคุณจะถามว่ามีการแสดงเส้นทางที่แท้จริงของไดเรกทอรีการทำงานปัจจุบัน มันมีไพ ธ อนและos.getcwd()ฟังก์ชั่น

สิ่งที่คุณเห็นด้านล่างคือการทดสอบเล็กน้อยจากภายในไดเรกทอรี "VirtualBox VMs" ที่อยู่ในไดเรกทอรีบ้านของฉัน ในความเป็นจริงมันเป็น symlink /mnt/HDDไปยังไดเรกทอรีที่แตกต่างกันอยู่บนฮาร์ดไดรฟ์ที่แตกต่างกันติดตั้งที่

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

อย่างที่คุณเห็นไพ ธ อนos.getcwd()จะแก้ไขเส้นทางที่แท้จริงของไดเรกทอรีไม่ใช่เส้นทางของ symlink

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.