"सीडी -" और "सीडी ~ -" के बीच अंतर


56

बैश आज्ञा

cd - 

पहले से उपयोग की गई निर्देशिका को प्रिंट करता है और उसमें परिवर्तन करता है।

दूसरी ओर, बैश कमांड

cd ~-

पहले से उपयोग की गई निर्देशिका में सीधे परिवर्तन, बिना कुछ गूँज के।

क्या यही एकमात्र अंतर है? प्रत्येक कमांड के लिए उपयोग का मामला क्या है?


3
मेरा सुझाव है कि आप इस मुश्किल सामान का उपयोग न करें। यह आपका दिमाग है cd ~-
डिप्रैडडैनियल

10
@DepressedDaniel, भले ही आप मुश्किल सामान का उपयोग करने की योजना नहीं बनाते हैं, यह समझना अभी भी उपयोगी है कि पर्दे के पीछे क्या चल रहा है - कोने के मामलों को समझना आपको बाद में एक छेद से बाहर निकाल सकता है जब कुछ अलग करने की कोशिश कर रहा हो।
दूसरा डेव

जवाबों:


81

यहां खेलने के लिए दो चीजें हैं। सबसे पहले, -अकेले आपकी पिछली निर्देशिका में विस्तारित है। यह (जोर मेरा) के cdभाग में समझाया गया है man bash:

-निर्देशिका परिवर्तन का प्रयास करने से पहले एक तर्क को $ OLDPWD में बदल दिया जाता है। यदि CDPATH से एक गैर-खाली निर्देशिका नाम का उपयोग किया जाता है, या यदि -पहला तर्क है, और निर्देशिका परिवर्तन सफल है, तो नई वर्किंग निर्देशिका का निरपेक्ष पथनाम मानक आउटपुट को लिखा जाता है। यदि निर्देशिका सफलतापूर्वक बदल दी गई थी, तो वापसी का मूल्य सही है; गलत है अन्यथा।

तो, एक सरल cd -आपको अपनी पिछली निर्देशिका में वापस ले जाएगा और निर्देशिका के नाम को प्रिंट करेगा। अन्य आदेश "टिल्ड एक्सपेंशन" खंड में प्रलेखित है:

यदि टिल्ड-प्रीफ़िक्स एक है ~+, शेल चर PWD का मान टिल्ड-प्रीफ़िक्स को बदल देता है। यदि टिल्ड-प्रीफ़िक्स एक है ~-, तो शेल वैरिएबल OLDPWD का मान, यदि यह सेट है, प्रतिस्थापित किया जाता है। यदि tilde- उपसर्ग में tilde के बाद वाले वर्णों में N की संख्या होती है, वैकल्पिक रूप से a +या a -से उपसर्ग होता है, तो tilde- उपसर्ग को डायरेक्टरी स्टैक से संबंधित तत्व से बदल दिया जाता है, क्योंकि यह dirs द्वारा निर्मित डारिन द्वारा प्रदर्शित किया जाएगा। एक तर्क के रूप में tilde- उपसर्ग। यदि टिल्ड-उपसर्ग में टिल्ड के बाद के अक्षर एक अग्रणी +या बिना एक संख्या से मिलकर बने होते हैं -, +तो मान लिया जाता है।

यह एक उदाहरण के साथ समझने में आसान हो सकता है:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

तो, सामान्य तौर पर, -"पिछली निर्देशिका" का मतलब है। इसीलिए cd -अपने आप से आप जहाँ भी थे वहाँ वापस चले जाएँगे।

मुख्य अंतर यह है कि बिलिन के cd -लिए विशिष्ट है cd। यदि आप echo -इसे करने की कोशिश करते हैं तो बस एक प्रिंट होगा -~-टिल्ड विस्तार कार्यक्षमता का हिस्सा है और एक चर की तरह ही व्यवहार करता है। इसलिए आप echo ~-कुछ सार्थक प्राप्त कर सकते हैं। आप इसका उपयोग भी कर सकते हैं cd ~-लेकिन आप इसे किसी अन्य कमांड में भी उपयोग कर सकते हैं। उदाहरण के लिए cp ~-/* .जो इसके बराबर होगाcp "$OLDPWD"/* .


1
set -xनिष्पादित करने से पहले विस्तारित कमांड को प्रिंट करने के लिए अंतर को स्पष्ट करने के लिए उपयोगी हो सकता है (या बस अपठित शोर हो सकता है जब आप इसे एक समय में एक कदम खुद नहीं कर रहे हों)।
पीटर कॉर्ड्स

1
@terdon आज मैंने सीखा।
11

संक्षेप में ... cd ~-/..काम करता है, cd -/..नहीं!
रे फॉस

13

~-को टिल्ड एक्सपेंशन (मैन बैश देखें) के अधीन किया जाता है, इसलिए जो cdदेखता है वह सीधे पिछले डायरेक्टरी का नाम है। -शेल द्वारा विस्तारित नहीं है, cdइसे सीधे देखता है, और दस्तावेज के रूप में व्यवहार करता है:

का एक तर्क - $ OLDPWD के बराबर है। यदि CDPATH से एक गैर-खाली निर्देशिका नाम का उपयोग किया जाता है, या यदि - पहला तर्क है, और निर्देशिका परिवर्तन सफल है, तो नई वर्किंग निर्देशिका का निरपेक्ष पथनाम मानक आउटपुट को लिखा जाता है।


4

TL; DR: cd -में बनाया गया है cd, ~-का एक बाद का विस्तार है ~[name], के लिए विशिष्ट नहीं है cd

POSIX.1-2008 शैल और उपयोगिताएँcd - एक विशेष मामले के रूप में परिभाषित होती हैं जो कमांड के लिए विशिष्ट है :cd

जब एक -ऑपरेंड के रूप में उपयोग किया जाता है, तो यह कमांड के बराबर होगा:

cd "$OLDPWD" && pwd

जो पिछली कार्यशील निर्देशिका में बदलता है और फिर अपना नाम लिखता है।

किसी भी कमांड को निष्पादित ~-करने $OLDPWDसे पहले एक्सटेंशन का विस्तार किया जाएगा और किसी भी कमांड के लिए एक तर्क के रूप में पारित किया जा सकता है, न कि केवल cd। यह और में बाद का विस्तार है ।

पूर्वोक्त POSIX.1-2008 शैल एवं उपयोगिताएँ मानक में भी टिल्ड विस्तार का विस्तृत विवरण है । शब्दांकन ~-मानक के दायरे में अपरिभाषित व्यवहार के लिए अनुमति देने के लिए बहुत विशिष्ट है , जहां ~[name]संदर्भित करता है $HOMEकि [name]क्या खाली स्ट्रिंग है, या उपयोगकर्ता का होम डायरेक्टरी nameयदि nameमान्य उपयोगकर्ता नाम है।

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