pushd, popd बनाम cd, cd- in bash and zsh


16

क्या bash बनाम zsh में pushd / popd के व्यवहार में कोई अंतर है? यह zd cd में लगता है, cd- बिल्कुल pushd / popd के रूप में एक ही व्यवहार करता है (जो cd के समय स्वचालित रूप से / cd निर्देशिका जोड़ता है) जबकि bash cd में dir स्टैक को प्रभावित नहीं करता है।

अगर कोई मुझे एक पॉइंटर दे सकता है जो बहुत अच्छा होगा।


मैं केवल बैश करने के लिए बोल सकता हूं: cdशेल चर का उपयोग OLDPWDपिछली निर्देशिका में करता है, और cd -अनुवाद करता है cd "$OLDPWD"
ग्लेन जैकमैन

@glennjackman, धन्यवाद। क्या इसका मतलब है कि bash cd में w / pushd / popd करने के लिए कुछ नहीं है?
ड्रैगनक्लांग्ग

मैंने अभी-अभी जाँच की, और pushdसेट भी कियाOLDPWD
ग्लेन जैकमैन

और प्यास, dirsहमेशा पीडब्ल्यूडी द्वारा पहले तत्व के रूप में धारण की जाती है
ग्लेन जैकमैन

हाँ, लेकिन यह भी बहुत मायने रखता है अगर cd dir स्टैक को नहीं छूता है जो कि bash में pushd / popd द्वारा प्रबंधित किया जाता है।
ड्रैगनक्लांग्ग

जवाबों:


17

निर्भर करता है। में zshआप कॉन्फ़िगर कर सकते हैं cdढेर स्वचालित रूप से निर्देशिका पर पुराने निर्देशिका पुश करने के लिए है, लेकिन यह डिफ़ॉल्ट सेटिंग नहीं है।

जहां तक ​​मैं zshडिफ़ॉल्ट सेटिंग्स के साथ बता सकता हूं , इसके समान व्यवहार करता है bash:

  • cd somedir
    • करने के लिए निर्देशिका बदलें somedir
    • में मूल निर्देशिका को बचाओ OLDPWD
    • सेट PWD="somedir"
    • निर्देशिका स्टैक के शीर्ष तत्व को बदलें (जैसा कि द्वारा दिखाया गया है dirs) somedir(स्टैक पर तत्वों की संख्या नहीं बदलती है)।
  • cd -:
    • करने के लिए निर्देशिका बदलें $OLDPWD
    • की अदला-बदली मूल्यों PWDऔरOLDPWD
    • प्रतिबिंबित करने के लिए निर्देशिका स्टैक के शीर्ष तत्व को संशोधित करें (नया) PWD
  • pushd somedir:
    • करने के लिए निर्देशिका बदलें somedir
    • में मूल निर्देशिका सहेजें OLDPWD
    • सेट PWD="somedir"
    • somedirनिर्देशिका स्टैक पर धक्का (इसे एक तत्व द्वारा विस्तारित करना)
  • popd:
    • में मूल निर्देशिका सहेजें OLDPWD
    • निर्देशिका स्टैक का पहला तत्व निकालें
    • निर्देशिका स्टैक के नए शीर्ष तत्व के लिए निर्देशिका बदलें
    • PWDनिर्देशिका स्टैक के नए शीर्ष तत्व पर सेट करें

नोट: चाहे वर्तमान कार्यशील निर्देशिका निर्देशिका ढेर के बीच अलग है का एक तत्व माना जाता है zshऔर bash। मैंने bashउपरोक्त सूचियों के लिए संदर्भ के रूप में उपयोग किया ।

  • में bashवर्तमान कार्यशील निर्देशिका निर्देशिका ढेर के शीर्ष तत्व माना जाता है। man 1 bashकहते हैं:

    pushd [-n] [dir]

    […] dirशीर्ष पर निर्देशिका स्टैक में जोड़ता है, यह नई वर्तमान कार्यशील निर्देशिका बनाता है जैसे कि यह cdबिलिन के तर्क के रूप में आपूर्ति की गई थी । [...]

    मुद्रण DIRSTACK( echo ${dirstack[@]}) पुष्टि करता है कि पहला तत्व इसके समान है $PWD

  • में zshवर्तमान कार्यशील निर्देशिका निर्देशिका ढेर का हिस्सा (लेकिन अभी भी साथ नहीं दिखाया है dirs)। man 1 zshbuiltinsकहते हैं:

    pushd [ -qsLP ] [ arg ]

    […] वर्तमान निर्देशिका को बदलें, और निर्देशिका स्टैक पर पुरानी वर्तमान निर्देशिका को धक्का दें। पहले रूप में, वर्तमान निर्देशिका को arg में बदलें। [...]

    मुद्रण dirstack( echo ${dirstack[@]}) और इसकी तुलना आउटपुट से dirsकरनी चाहिए , यह दर्शाता है कि यह PWD`प्यास का हिस्सा नहीं है।

दोनों गोले dirsमें वर्तमान कार्य निर्देशिका को पहले तत्व के रूप में प्रिंट करता है। इसके अलावा दोनों गोले में, सूचकांक के साथ निर्देशिका स्टैक तत्व 1उस निर्देशिका को संदर्भित करता है जो अंतिम से पहले चालू था pushd। ऐसा इसलिए है क्योंकि सरणियों में है zshआमतौर पर से गिने जा रहे हैं 1, जबकि वे से गिने जा रहे हैं 0में bash। इसलिए थोड़ा व्यावहारिक अंतर है


जैसा कि ऊपर कहा गया है, इस व्यवहार को संशोधित किया जा सकता है zsh

यदि आप AUTO_PUSHDविकल्प सेट करते हैं तो zsh( setopt autopushd) cd somedirऐसा व्यवहार करता है pushd somedir, पिछली निर्देशिका को स्वचालित रूप से निर्देशिका स्टैक पर धकेल दिया जाता है। शायद आपकी मशीन पर भी यही स्थिति है। आप उन setoptविकल्पों की एक सूची प्राप्त करने के लिए दौड़ सकते हैं जो डिफ़ॉल्ट तरीके से सेट नहीं हैं। देखें, autopushdसूची में दिखाई देता है या नहीं ।

लेकिन यह ऐसा cd -व्यवहार करने के लिए संशोधित नहीं करता है popd। इसके बजाय यह सिर्फ $PWDडायरेक्टरी स्टैक पर धकेलता है और डायरेक्टरी को बदलता है $OLDPWD। इसका मतलब है कि बार-बार कॉल करने cd -से वास्तव में डायरेक्टरी स्टैक ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)) बढ़ेगा । यदि यह वास्तव में popdआपके सिस्टम पर ठीक वैसा ही व्यवहार करता है, तो मैं सुझाव cdदूंगा कि क्या वास्तव में बिलिन ( whence -v cd) है; यह संभव है कि इसकी जगह एक उपनाम या फ़ंक्शन हो।

चूंकि निर्देशिका स्टैक सक्षम होने के बजाय तेज़ी से बढ़ेगा AUTO_PUSHD, आप पैरामीटर DIRSTACKSIZEको इच्छित अधिकतम आकार में सेट करके इसके आकार को सीमित कर सकते हैं ।
आप PUSHD_IGNORE_DUPSविकल्प सेट करके डुप्लिकेट को भी रोक सकते हैं ।
अधिक विकल्पों के लिए मैनुअल पर एक नज़र है ।


इसके माध्यम से देखने के अलावा निर्देशिका स्टैक का उद्देश्य क्या है dirs?
ज़ेरुस 21

@Xerus यह पथ पर जाने popd(या यहां तक ​​कि पता करने) की आवश्यकता के बिना पहले से देखी गई निर्देशिकाओं पर वापस जाने की अनुमति देता है ।
Adaephon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.