क्या सिम्लिंक का लक्ष्य गंतव्य की मूल निर्देशिका के सापेक्ष है और यदि हां, तो क्यों?


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>

क्या यह अभीष्ट व्यवहार है और कृपया बताएं कि क्यों ...


यह शायद वें एफ़एक्ट के साथ कुछ करना है जो का उपयोग कर रहा है .. / रिश्तेदार पथ के बजाय पथ घोषित करने के लिए निरपेक्ष पथ का उपयोग करें। एक अच्छी बात यह है कि हमेशा निरपेक्ष पथ का उपयोग करें
किवी

मैं सबसे अच्छे अभ्यास से सहमत हूं क्योंकि मैंने हमेशा लक्ष्य और गंतव्य दोनों के लिए निरपेक्ष पथों का उपयोग किया है। हालांकि, आदमी
बताता है

जवाबों:


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

मैन पेज के अनुसार, इस प्रारूप के लिए दो संभावित मैच हैं

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

यह पहले फॉर्म (इसके पहले से) से मेल खाएगा। अब, "लक्ष्य नाम" या clientआपके मामले में, पूर्ण के अनुसार हो सकता हैln मैनुअल के ) मनमाना तार हो सकता है। उन्हें अभी कुछ भी हल करने की आवश्यकता नहीं है, लेकिन भविष्य में कुछ करने का संकल्प कर सकते हैं। आप अपने आह्वान के साथ जो बना रहे हैं, वह एक "झूलता हुआ सिमलिंक" है और सिस्टम आपको इन्हें बनाने से रोकता नहीं है।

अब आपका दूसरा आह्वान ln -s ../client build/clientहै जिसे "रिश्तेदार सिम्लिंक" कहा जाता है (जैसा कि आपने अपनी पोस्ट में उल्लेख किया है)। एक दूसरा प्रकार है और यह एक "पूर्ण सिमिलिंक" है जिसे करने से बुलाया जाएगाln -s /home/user/client build/client

यह कोई बग नहीं है। मैनुअल के अनुसार यह बताता है:

वर्तमान निर्देशिका की तुलना में किसी अन्य स्थान पर एक सापेक्ष सिम्लिंक बनाते समय, सिम्लिंक का रिज़ॉल्यूशन वर्तमान निर्देशिका से एक ही स्ट्रिंग के रिज़ॉल्यूशन से अलग होगा। इसलिए, कई उपयोगकर्ता पहले निर्देशिकाओं को उस स्थान पर बदलना पसंद करते हैं जहां रिश्तेदार सिमलिंक बनाया जाएगा, ताकि टैब-पूरा होने या अन्य फ़ाइल रिज़ॉल्यूशन को वही लक्ष्य मिल जाए जो सिमलिंक में रखा जाएगा।

- से info coreutils 'ln invocation'

उस ने कहा, आप लक्ष्य के सापेक्ष या निरपेक्ष पथ का उपयोग करना चाहिए


5

यह वास्तव में इच्छित व्यवहार है। से ln(1)आदमी पेज:

प्रतीकात्मक लिंक मनमाना पाठ पकड़ सकते हैं; यदि बाद में हल किया जाता है, तो एक रिश्तेदार लिंक इसकी मूल निर्देशिका के संबंध में व्याख्या की जाती है।

क्यों यह करने के लिए के रूप में, कल्पना अगर सिम्लिंक इसके स्रोत के बजाय अपने स्रोत के सापेक्ष व्याख्या की गई थी। जब बाद में इसे हल किया जाता है, तो आपको यह जानना होगा कि जब आपने इसे बनाया था, तो आपका CWD क्या था, जो निरर्थक है, अकेले ही असंभव है।

इसके अलावा, इस तरह से आपको एक कंकाल निर्देशिका संरचना बनाने के लिए एक साफ और कॉम्पैक्ट तरीका मिलता है जिसे आप सहूलियत को तोड़ने के बिना निर्देशिका पेड़ में कहीं भी छोड़ सकते हैं।

आपको मेरे उदाहरण का एक उदाहरण देने के लिए, मान लीजिए कि आप एक परियोजना पर काम कर रहे हैं और आपके पास इसके लिए एक पूरी निर्देशिका संरचना स्थापित है:

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

अब मान लीजिए कि आप widgets/अंदर एक सिंबल बनाना चाहते हैं wizardry/। आपके पास दो विकल्प हैं:

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

या

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

यदि आप फिर /home/you/projectकहीं और जाने की कोशिश करते हैं , तो पहले फॉर्म के साथ बनाया गया एक सिमलिंक टूट जाएगा क्योंकि वह खोज रहा है /home/you/project/widgets। दूसरा रूप सिम्लिंक को कार्यात्मक रखेगा क्योंकि यह उस स्थान के ../widgets सापेक्ष खोज रहा है, भले ही वह स्थान डायरेक्टरी ट्री में हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.