एक निर्देशिका और रिश्तेदार पथ के लिए प्रतीकात्मक लिंक


15

मैंने डायरेक्टरी (ब्लिंक) के लिए पूर्ण पथ के साथ सिमलिंक बनाया है और उदाहरण के लिए निम्नलिखित पेड़ हैं:

$ ls -l /tmp/A
total 0
lrwxrwxrwx 1 root root 6 Apr  3 12:27 Blink -> /tmp/B
-rw-r--r-- 1 root root 0 Apr  3 12:27 foo

$ ls -l /tmp/B
total 0
-rw-r--r-- 1 root root 0 Apr  3 12:27 bar

तब मैं / tmp / A पर जाता हूं और निर्देशिका को ब्लिंक में बदलता हूं:

$ cd /tmp/A
$ pwd
/tmp/A
$ cd Blink
$ pwd
/tmp/A/Blink

cd ..मुझे लौटाता है /tmp/A लेकिन अगर मैं उदाहरण के लिए टाइप करता हूँ तो मुझे ls ../fooत्रुटि मिली है:

ls: ../foo: No such file or directory

बिल्ट cd कमांड सॉल्यूशन पाथ को आवश्यकतानुसार, लेकिन एक्सटर्नल ls को .. अप-लेवल ऑफ / tmp / B के रूप में मानते हैं और इसलिए जू नहीं पा सकते हैं।

यहां क्या समस्या है? क्या मुझे foo फ़ाइल / tmp / A / Blink से संबंधित पथ जैसे ../foo से मिल सकती है?


एक ही सवाल पर पोस्ट की गई है SuperUser
Peter.O

जवाबों:


13

मुझे नहीं लगता कि आप ऐसा कर सकते हैं। गोले आजकल ट्रैक करते हैं कि उन्हें कैसे मिला, वे कहाँ हैं, वे वर्तमान कामकाजी निर्देशिका का ट्रैक नाम से रखते हैं, बजाय फाइल सिस्टम और ओएस पर निर्भर रहने के। इसका मतलब है कि बिल्ट-इन cdसीधे प्रतीकात्मक लिंक के बजाय "बैक अप" जा सकता है।

लेकिन जब आप दौड़ते हैं ls ../foo, lsतो यह पता नहीं होता है कि प्रतीकात्मक लिंक के बाद शेल को एक निर्देशिका मिली है। lsstat()"../foo" पर करेगा । ".." भाग वर्तमान निर्देशिका से आता है, जिसमें केवल एक एकल है .. "इसके लिए पैतृक प्रविष्टि" है। संपूर्ण प्रतीकात्मक लिंक चीज़ों को बदलने का तरीका नहीं है, निर्देशिकाओं में एकल "" है। और एक एकल ".." प्रविष्टि। प्रतीकात्मक लिंक कर्नेल को फ़ाइल पथ में अप्रत्यक्ष की एक अतिरिक्त परत डालने देते हैं। जब आप करने के लिए "../whatever" पारित open()या stat(), गिरी बस प्रक्रिया आंकड़ा बाहर जो एकल निर्देशिका द्वारा नामित किया गया है करने के लिए कॉल करने की वर्तमान कार्यशील निर्देशिका का उपयोग करता है ".."।


17

शेल वर्तमान कार्य निर्देशिका को इसमें संग्रहीत करता है $PWD । शेल शेलिंस के लिए इसका उपयोग किया जाता है cdऔर pwd, यह सहानुभूति को सामान्य निर्देशिकाओं के रूप में मानता है, जैसा कि आपने देखा है। कभी-कभी यह सहायक होता है, कभी-कभी नहीं।

आप वास्तविक निर्देशिका का उपयोग कर पा सकते हैं pwd ( help pwdअधिक विवरण के लिए प्रकार ) :

$ pwd
/tmp/A/Blink
$ pwd -L
/tmp/A/Blink
$ pwd -P
/tmp/B

इसी तरह, cdएक विकल्प है-P (फिर से, help cdआपका दोस्त है):

$ cd /tmp/A/Blink
$ pwd
/tmp/A/Blink
$ cd -P ..
$ pwd -P
/tmp

अंत में, आप "सुविधा" को पूरी तरह से बंद कर सकते हैं:

$ set -P
$ cd /tmp/A/Blink
$ pwd
/tmp/B

धन्यवाद, मैं सेट-फीचर के बारे में अवगत हूं, लेकिन ls कमांड व्यवहार से भ्रमित था ...
user478681

जैसा मैंने कहा, उपयोग set -Pऔर एल एस व्यवहार समझ में आने लगता है। :)
ams

2

ब्रूस और एम्स ने पीछे के व्यवहार को समझाते हुए सुंदर जवाब दिए। लेकिन वास्तव में ls ../fooआप पूछ रहे थे, आप कुछ ऐसा कर सकते हैं

ls $(dirname $PWD)/foo

1

आप यह नहीं कर सकते, क्योंकि /tmp/A/Blink है वास्तव में/tmp/B । तो, ls ../A/fooकाम करता है।

आप इसके बजाय वास्तविक निर्देशिका के लिए सीडी को सक्षम करने के लिए उपयोगी हो सकते हैं , बजाय उपनाम के । ऐसा करने के लिए, आप इसके बजाय निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं (जिसे आप अपने .bashrc में डाल सकते हैं) /tmp/B/tmp/A/Blinkcd

lcd() { cd $(readlink -f "$1"); }

lcd, ज़ाहिर है, सामान्य और प्रतीकात्मक-जुड़े निर्देशिकाओं के लिए काम करता है।
नोट: readlink -fलिंक के अंतिम लक्ष्य पर कार्य करता है (जब लिंक डेज़ी-जंजीर होते हैं) ।।


1
cd -Pसरल लगता है।
jw013

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