यदि मैं वास्तव में कमांड लाइन से सिम्कलिन स्थान पर हूं तो कैसे बताऊं?


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
कुछ गोले वास्तव में आपको सिम्लिंक के अंदर रहने की अनुमति नहीं देते हैं। उदाहरण के लिए, fishशेल स्वचालित रूप से सिम्लिंक को हल करता है जब आप cdइसमें होते हैं।
ट्राइसिटी

जवाबों:


56

आपके pwdआदेश को कैसे कॉन्फ़िगर किया गया है, इस पर निर्भर करते हुए , यह तार्किक कार्य निर्देशिका (आउटपुट द्वारा pwd -L) को दिखाने के लिए डिफ़ॉल्ट हो सकता है जो सिमलिंक स्थान, या भौतिक कार्य निर्देशिका (आउटपुट pwd -P) दिखाएगा, जो सिमलिंक को अनदेखा करता है और "वास्तविक" निर्देशिका दिखाता है।

पूरी जानकारी के लिए आप कर सकते हैं

file "$(pwd -L)"

एक सिमलिंक के अंदर, यह वापस आ जाएगा

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

1
हाँ, -Pझंडा मुझे चाहिए था। धन्यवाद
ओलिवर विलियम्स

6
भी शीर्षक, बस उपयोग में प्रश्न का उत्तर देने test "$(pwd -L)" = "$(pwd -P)" && echo No symlinksके लिए (या बदलने के && echo No symlinksसाथ || echo Symlinks)।
बजे एक CVn

1
यह सवाल का जवाब पूरी तरह से गूंजने की आवश्यकता के बिना है। यदि प्रश्न था 'अगर मैं एक सहानुभूति वाली निर्देशिका में हूं तो मैं एक संदेश कैसे प्रदर्शित करूं? "तो प्रतिध्वनि की आवश्यकता होगी।
Arronronical

file "$(pwd)"केवल तभी काम करता है यदि सिम्लिंक अंतिम निर्देशिका घटक है। यह जब सीडी करने के लिए ओपी के सिम्बल का पता नहीं लगाता है /home/cpm135/public_html/class/foo/bar। मुझे ऐसी किसी भी चीज़ के बारे में जानकारी नहीं है जो किसी पथनाम में सभी सिम्बलिंक के लिए जानकारी प्रिंट करती है, लेकिन आप इसका उपयोग भी कर सकते हैं realpath ., जो मुझे लगता है कि इसके बराबर हैpwd -P
पीटर कॉर्ड्स

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 -freadlink -f .के समान काम करता है pwd -P


2
यद्यपि मैंने वह कठिन तरीका सीखा है जो readlink -fसभी यूनियनों पर उपलब्ध नहीं है (उदाहरण के लिए OS-X पर उपलब्ध नहीं है)
समाप्त करें '17:55

3

आप वास्तव में हैं /home/cpm135/public_html/class- यह "मेरे वर्तमान कामकाजी निर्देशिका क्या है" के सवाल का एकमात्र सही उत्तर है।

जब आप देखें /var/lib/class... कि वास्तव में आप कहां हैं, लेकिन इस बारे में अधिक नहीं है कि आप किस रास्ते पर पहुंचे थे

जब आप दौड़ते हैं /bin/pwd, तो यह आपकी वर्तमान कार्यशील निर्देशिका को देखकर पता लगाता है। और .. निर्देशिका (शीर्ष पर सूचीबद्ध ls -la), किस निर्देशिका में काम कर रही है .. के साथ मेल खाता है। और तब तक पीछे की ओर काम करना .. और। उसी निर्देशिका का संदर्भ लें। एक बार यह सब हो जाने के बाद, यह जानता है कि आपकी वर्तमान कार्यशील निर्देशिका क्या है।

जब आप pwdशेल-इन- रन चलाते हैं , तो यह इस प्रक्रिया का पालन नहीं करता है (हालांकि अगर जरूरत हो तो इसमें से कुछ कर सकता है) - इसके बजाय, यह उस पथ को याद करता है जिसे आपने यहां लाने के लिए लिया था। इसलिए हर बार जब आप एक cdकमांड करते हैं, तो आपका शेल याद रखता है कि रास्ते के हिस्से के रूप में आप अभी कहाँ हैं, और आपके द्वारा किए गए pwdसभी cdकमांड के आधार पर इसकी गणना करता है - जो आपका वास्तविक हो सकता है या नहीं। कार्यकारी डाइरेक्टरी।

चीजें वास्तव में अजीब हो सकती हैं जब आप एक करते हैं ln -s . fooऔर cdफू में रखते हैं - /bin/pwdकहेंगे कि आप अभी भी एक ही निर्देशिका में हैं, लेकिन शेल बिलीन pwdआप कहेंगे /foo/foo/foo/foo/foo/foo- भले ही ऐसी कोई निर्देशिका अभी भी मौजूद नहीं है। (उस ने कहा - आप शायद इसमें हो सकते cd हैं।)

यदि निर्देशिकाओं का नाम बदला जाता है, तो भ्रम का एक अन्य स्रोत है। /bin/pwdतब तुरंत परिवर्तन होगा, लेकिन अंतर्निहित pwdजब तक आप ऐसा कुछ नहीं करेंगे जो यह बताता है कि पुरानी निर्देशिका का नाम मायने नहीं रखता है।


1
आप सवाल का जवाब नहीं दे रहे हैं, आप इसे खारिज कर रहे हैं।
दिमित्री ग्रिगोरीव

4
हालांकि यह सीधे सवाल का जवाब नहीं देता है , मुझे लगता है कि यह शेल के pwdबिलिन के बीच के अंतर को समझने और यह समझने के लिए एक उपयोगी पोस्ट है /bin/pwdकि स्टैंड-अलोन संस्करण कैसे अधिक उपयोगी जानकारी प्रदान करता है (जो मूल प्रश्न का उत्तर दे सकता है)।
एंथनी जी -

1
ये अंतर सभी -Pऔर -Lअन्य उत्तरों द्वारा उल्लिखित विकल्पों को उबालते हैं । संक्षेप में, कुछ कार्यान्वयन एक के लिए डिफ़ॉल्ट हैं, कुछ में दूसरे के लिए। सेंटोस सिस्टम पर मुझे हाथ लगाना है, बैश का बिलिन तार्किक रूप से डिफ़ॉल्ट है, और /bin/pwdभौतिक के लिए डिफ़ॉल्ट है, लेकिन दोनों कमांड-लाइन विकल्पों को स्वीकार करते हैं और परिणाम पर सहमत होते हैं जब वे दिए जाते हैं।
IMSoP

1
प्रश्न एक गलत आधार पर आधारित है - 'क्या यह जानने का कोई तरीका है कि मैं "वास्तव में" / var / lib / वर्ग में हूँ? " कहा कि ... यह समझाने से कि वास्तव में इसका क्या मतलब है, यह उसे समझने में मदद करता है कि वह वास्तव में क्या देख रहा है। Pwd -P और -L विकल्पों का उल्लेख पहले ही किया जा चुका था ...
dougmc

1
आपके पास अपना तर्क पीछे की ओर है। ls ..की सामग्री दिखाएगा /var/lib, नहीं /home/cpm135/public_html cd ..विशेष है: शेल "आप वहां कैसे पहुंचे" की विशेष ट्रैकिंग करता है और वास्तव में chdir("..")सिस्टम कॉल नहीं करता है । जहां तक ​​कर्नेल का संबंध है, आपके शेल की वर्तमान कार्यशील निर्देशिका ( /proc/self/cwd) सिर्फ एक माउंटपॉइंट: इनोड जोड़ी है। यह निर्देशिका पर एक ओपन फाइल डिस्क्रिप्टर की तरह है, यही वजह है कि निर्देशिका का नाम बदलने से आपका शेल नहीं टूटता है। ( cd .शेल के $PWDचर को अद्यतन करने के लिए )। आप एक उपयोगी बिंदु बना रहे हैं, इसलिए मैं इसे ठीक करूंगा जब तय हो जाएगा
पीटर कॉर्ड्स

1

अनिवार्य रूप से आप पूछ रहे हैं कि क्या वर्तमान कार्यशील निर्देशिका का वास्तविक मार्ग दिखाना है। खैर, अजगर और os.getcwd()फ़ंक्शन के साथ है

जो आप नीचे देख रहे हैं वह "वर्चुअलबॉक्स वीएम" निर्देशिका के भीतर से एक छोटी सी परीक्षा है जो मेरे होम डायरेक्टरी में स्थित है। हकीकत में, यह अलग हार्ड ड्राइव पर स्थित एक अलग निर्देशिका के लिए एक सहानुभूति है, जो घुड़सवार है /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()ने निर्देशिका के वास्तविक पथ को हल किया है, न कि सहानुभूति के मार्ग को।

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