ln -s pwd के सापेक्ष एक पथ के साथ


26

मैं प्रतीकात्मक लिंक का एक गुच्छा बनाने की कोशिश कर रहा हूं, लेकिन मैं यह पता नहीं लगा सकता कि यह क्यों काम कर रहा है

ln -s /Users/niels/something/foo ~/bin/foo_link

जबकि यह

cd /Users/niels/something
ln -s foo ~/bin/foo_link

नहीं है।

मेरा मानना ​​है कि इसके बजाय foo_linkफू को जोड़ने के साथ कुछ करना /Users/niels/binहै/Users/niels/something

तो सवाल यह है कि मैं एक प्रतीकात्मक लिंक कैसे बनाऊं जो वास्तव में टाइप किए बिना एक निरपेक्ष पथ की ओर इशारा करता है?

संदर्भ के लिए, मैं Mac OS X 10.9 और Zsh का उपयोग कर रहा हूं।

जवाबों:


33

संपूर्ण पथ स्ट्रिंग टाइप किए बिना वर्तमान निर्देशिका को एक निरपेक्ष पथ से जोड़ने का सबसे आसान तरीका है

ln -s "$(pwd)/foo" ~/bin/foo_link

target(प्रथम) के लिए तर्क ln -sआदेश प्रतीकात्मक कड़ी का स्थान नहीं, बल्कि आपके वर्तमान निर्देशिका के सापेक्ष काम करता है। यह जानने में मदद करता है कि, अनिवार्य रूप से, बनाया गया सिमलिंक (दूसरा तर्क) आपके पास पहले तर्क के लिए प्रदान किए गए पाठ को रखता है।

इसलिए, यदि आप निम्न कार्य करते हैं:

cd some_directory
ln -s foo foo_link

और फिर उस लिंक को चारों ओर घुमाएं

mv foo_link ../some_other_directory
ls -l ../some_other_directory

आप देखेंगे कि यह उस निर्देशिका में इंगित करने का foo_link प्रयास करता है fooजिसमें यह निवास कर रहा है। यह सापेक्ष रास्तों की ओर संकेत करते हुए प्रतीकात्मक लिंक के साथ भी काम करता है। यदि आप निम्न कार्य करते हैं:

ln -s ../foo yet_another_link

और फिर yet_another_linkकिसी अन्य निर्देशिका में जाएं और जांचें कि यह कहां इंगित करता है, आप देखेंगे कि यह हमेशा इंगित करता है ../foo। यह इच्छित व्यवहार है, क्योंकि कई बार प्रतीकात्मक लिंक एक निर्देशिका संरचना का हिस्सा हो सकते हैं जो विभिन्न निरपेक्ष पथों में निवास कर सकते हैं।

आपके मामले में, जब आप टाइप करके लिंक बनाते हैं

ln -s foo ~/bin/foo_link

foo_linkबस fooइसके स्थान के सापेक्ष एक लिंक रखता है । लाना $(pwd)लक्ष्य तर्क के नाम के सामने बस वर्तमान कार्यशील निर्देशिका के निरपेक्ष पथ कहते हैं, जिससे वे सभी एक निरपेक्ष लक्ष्य के साथ बनाया जाता है।


"... यह कल्पना करने में मदद करता है कि बनाया गया सिमलिंक केवल पाठ रखता है ...." क्या यह शाब्दिक सत्य नहीं है?
वाइल्डकार्ड

1
यह है। शायद मैं कल्पना को "जानने" या "समझने" में बदल सकता था ।
Achilleas

शायद मैंने खुद को भ्रमित (फिर से) कर लिया है। ऐसा लगता है जहाँ आप कहते हैं "लक्ष्य" का अर्थ है "स्रोत"। source_file(प्रथम) तर्क जहां लिंक अंक, जो शब्दशः क्या आप आदेश पर दर्ज है। target_fileक्या आप में प्रवेश जब तक कि एक निर्देशिका, जिस स्थिति में लिंक नाम की basename रूप में ही है (दूसरा) तर्क लिंक का नाम हो जाता है source_fileलेकिन निर्देशिका में रखा target_file
चार्ली गोरीचांज़

तुम ठीक कह रहे, ̶ अगर वहाँ एक गलती म ̶a̶n̶s̶w̶e̶r̶.̶ पागल कैसे यह फ्लॉप मिल पकड़ा ̶s̶o̶o̶n̶e̶r̶.̶ ̶F̶i̶x̶i̶n̶g̶.̶ नहीं है, इस सवाल का जवाब सही था। lnमैनपेज द्वारा , targetपहला तर्क है (जहां लिंक इंगित करता है ) जबकि दूसरा तर्क बस के रूप में संदर्भित किया जाता है link( sourceइसका उल्लेख नहीं है)।
अचिलियास

3
Linux (gnu ln) में मैन पेज को पहला तर्क targetऔर दूसरा link( man7.org/linux/man-pages/man1/ln.1.html ) कहता है । लेकिन BSD में (OS X सहित) पहला कहा जाता है sourceऔर दूसरा target( freebsd.org/cgi/man.cgi?ln )। काफी उलझन भरा।
समीक्षक

5

-r( --relative) ध्वज का उपयोग करने से यह काम हो जाएगा:

ln -sr foo ~/bin/foo_link

4
-rखबर है कि एक GNUism है, यानी गैर POSIX इसलिए ओपी के मामले में काम नहीं करेगा क्योंकि मानक ओएस एक्स lnकमांड बीएसडी आधारित है।
जुलियाग्रे

2

कुछ टाइपिंग को बचाने के लिए, आप कर सकते हैं

ln -s "$PWD"/foo ~/bin/foo_link

@ फ़्रेड्डी, यह शेल पर निर्भर करता है। मछली या zsh में, यह ठीक होगा। बोर्न सहित बॉर्न जैसे गोले और $ IFS के डिफ़ॉल्ट मूल्य के साथ, SPC वास्तव में एक समस्या होगी, लेकिन TAB, NL और सभी गोलाकार अक्षर (कम से कम *, ?और [...]) भी।
स्टीफन चेज़लस

@ StéphaneChazelas हां, आप सही हैं और सवाल का टैग लगा हुआ है bash, इसलिए इसे उद्धृत करना आम तौर पर एक अच्छा विचार है। मेरा बुरा, मुझे और अधिक विशिष्ट होना चाहिए था।
फ्रेडी

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