เป้าหมายของ symlink นั้นสัมพันธ์กับไดเรกทอรีหลักของปลายทางหรือไม่และถ้าใช่ทำไม


14

ฉันมีโครงสร้างไฟล์ต่อไปนี้:

build/
client/
  –> index.js

และเมื่อฉันพยายามสร้างลิงค์สัญลักษณ์ชื่อ "ลูกค้า" ในไดเรกทอรีสร้างที่อ้างถึงไดเรกทอรีลูกค้าใน cwd เช่นนั้น

// Fails
$ pwd
/home/user/
$ ln -s client build/client 
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links

ฉันพบข้อผิดพลาด ELOOP ที่แสดงด้านบน เมื่อฉันเปลี่ยนเส้นทางเป้าหมายให้สัมพันธ์กับเส้นทางปลายทางทั้งหมดจะดี:

// Works
$ pwd
/home/user/
$ ln -s ../client build/client 
$ stat build/client/index.js
stat: <outputs file stats>

นี่คือพฤติกรรมที่ตั้งใจและโปรดอธิบายว่าทำไม ...


นี่อาจเป็นสิ่งที่เกี่ยวข้องกับสิ่งเร้าที่ใช้ .. / ใช้เส้นทางที่แน่นอนในการประกาศเส้นทางแทนเส้นทางญาติ มืออาชีพที่ดีคือการใช้เส้นทางที่แน่นอนเสมอ
Kiwy

ฉันเห็นด้วยกับแนวปฏิบัติที่ดีที่สุดเนื่องจากฉันใช้เส้นทางที่แน่นอนสำหรับทั้งเป้าหมายและปลายทาง อย่างไรก็ตามหน้า man ระบุว่าเส้นทางญาติสามารถใช้ทั้ง ...
jibsales

คำตอบ:


13

สำหรับคนที่ไม่ได้ผลถ้าเราดูls -lผลลัพธ์เราจะได้สิ่งต่อไปนี้:

[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client

ตอนนี้ให้เข้าใจสิ่งที่เกิดขึ้นที่นี่ ลองดูคำสั่งที่คุณเรียกว่า:

ln -s client build/client

ตามหน้า Man มีสองที่เป็นไปได้สำหรับรูปแบบนี้

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
       ln [OPTION]... TARGET... DIRECTORY     (3rd form)

มันจะจับคู่กับแบบฟอร์มแรก (ตั้งแต่แรก) ตอนนี้ "ชื่อเป้าหมาย" หรือclientในกรณีของคุณสามารถ (ตามlnคู่มือที่สมบูรณ์) สตริงโดยพลการ พวกเขาไม่ต้องแก้ไขอะไรเลยในตอนนี้ แต่สามารถแก้ไขบางสิ่งได้ในอนาคต สิ่งที่คุณกำลังสร้างด้วยการภาวนาของคุณคือ "ห้อย symlink" และระบบไม่ให้คุณสร้างสิ่งเหล่านี้

ตอนนี้การร้องขอครั้งที่สองของคุณln -s ../client build/clientคือสิ่งที่เรียกว่า "symlink แบบสัมพัทธ์" (ดังที่คุณได้บันทึกไว้ในโพสต์ของคุณเอง) มีประเภทที่สองและที่เป็น "symlink แน่นอน" ln -s /home/user/client build/clientซึ่งจะเรียกว่าด้วยการทำ

นี่ไม่ใช่ข้อผิดพลาด ตามคู่มือระบุว่า:

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

- จาก info coreutils 'ln invocation'

ที่กล่าวว่าคุณต้องใช้เส้นทางสัมพัทธ์หรือเส้นทางสัมบูรณ์ไปยังเป้าหมาย


5

นี่เป็นพฤติกรรมที่ตั้งใจไว้ จากln(1)หน้าคน:

ลิงก์สัญลักษณ์สามารถเก็บข้อความโดยพลการ หากแก้ไขในภายหลังลิงก์ที่เกี่ยวข้องจะถูกตีความโดยสัมพันธ์กับไดเรกทอรีหลัก

สำหรับสาเหตุของมันจินตนาการว่า symlink ถูกตีความแทนที่จะเกี่ยวข้องกับแหล่งที่มามากกว่าปลายทาง เมื่อแก้ไขปัญหาได้ในภายหลังคุณจะต้องรู้ว่า CWD ของคุณคืออะไรเมื่อคุณสร้างมันขึ้นมาซึ่งไร้สาระ

ยิ่งไปกว่านั้นวิธีนี้คุณจะได้วิธีที่เป็นระเบียบและกะทัดรัดในการสร้างโครงสร้างไดเรกทอรี Skeleton ที่คุณสามารถดร็อปที่ใดก็ได้ในแผนผังไดเรกทอรีโดยไม่ทำลาย symlink

เพื่อให้ตัวอย่างสิ่งที่ฉันหมายถึงสมมติว่าคุณกำลังทำงานในโครงการและคุณมีการตั้งค่าโครงสร้างไดเรกทอรีทั้งหมดสำหรับมันโดย:

$ ls -1 /home/you/project
thingummies/
widgets/
wizardry/

ตอนนี้สมมติว่าคุณต้องการที่จะสร้าง symlink ไปภายในwidgets/ wizardry/คุณมีสองทางเลือก:

$ ln -s /home/you/project/widgets /home/you/project/wizardry

หรือ

$ ln -s ../widgets /home/you/project/wizardry

จากนั้นถ้าคุณลองย้าย/home/you/projectทุกที่อื่น symlink /home/you/project/widgetsที่สร้างขึ้นด้วยรูปแบบครั้งแรกจะทำลายเพราะมันกำลังมองหา รูปแบบที่สองจะทำให้ symlink ทำงานได้เนื่องจากมันกำลังมองหาที่../widgets สัมพันธ์กับสถานที่ที่มันอยู่โดยไม่คำนึงถึงสถานที่ที่อาจอยู่ในต้นไม้ไดเรกทอรี

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