pushd और popd कमांड बैश शेल की अंतर्निहित विशेषताएं हैं जो आपको अपने हार्ड ड्राइव पर स्थानों के बीच त्वरित नेविगेशन के लिए डायरेक्टरी को "बुकमार्क" करने में मदद करती हैं। आप पहले से ही महसूस कर सकते हैं कि टर्मिनल आपके कंप्यूटर को नेविगेट करने का एक असंभव रूप से तेज़ तरीका है; बस कुछ की प्रेस में, आप अपने हार्ड ड्राइव, अटैच्ड स्टोरेज, या नेटवर्क शेयर पर कहीं भी जा सकते हैं। लेकिन वह गति टूट सकती है जब आप खुद को डायरेक्टरी के बीच आगे-पीछे जाते हुए पाते हैं, या जब आप अपने फाइलसिस्टम के भीतर "खो" जाते हैं। ये ठीक वे समस्याएं हैं जिन्हें pushd और popd हल करने में मदद कर सकते हैं।
pushd
अपने सबसे बुनियादी स्तर पर, pushd cd की तरह बहुत है। यह आपको एक डायरेक्टरी से दूसरी डायरेक्टरी में ले जाता है। मान लें कि आपके पास one नामक एक डायरेक्टरी है, जिसमें two नामक एक सबडायरेक्टरी है, जिसमें three नामक एक सबडायरेक्टरी है, और इसी तरह। यदि आपकी वर्तमान वर्किंग डायरेक्टरी one है, तो आप cd कमांड के साथ two या three या कहीं भी जा सकते हैं:
$ pwd
one
$ cd two/three
$ pwd
three
आप pushd के साथ भी ऐसा ही कर सकते हैं:
$ pwd
one
$ pushd two/three
~/one/two/three ~/one
$ pwd
three
pushd का अंतिम परिणाम cd के समान है, लेकिन एक अतिरिक्त इंटरमीडिएट परिणाम है: pushd आपकी डेस्टिनेशन डायरेक्टरी और आपके मूल बिंदु को इको करता है। यह आपका डायरेक्टरी स्टैक है, और यही pushd को अद्वितीय बनाता है।
स्टैक्स
कंप्यूटर शब्दावली में, एक स्टैक तत्वों के संग्रह को संदर्भित करता है। इस कमांड के संदर्भ में, तत्व वे डायरेक्टरी हैं जिन पर आप हाल ही में pushd कमांड का उपयोग करके गए हैं। आप इसे एक इतिहास या ब्रेडक्रंब ट्रेल के रूप में सोच सकते हैं।
आप pushd के साथ अपने फाइलसिस्टम पर कहीं भी जा सकते हैं; हर बार, आपके पिछले और नए स्थान स्टैक में जोड़े जाते हैं:
$ pushd four
~/one/two/three/four ~/one/two/three ~/one
$ pushd five
~/one/two/three/four/five ~/one/two/three/four ~/one/two/three ~/one
स्टैक को नेविगेट करना
एक बार जब आप एक स्टैक बना लेते हैं, तो आप इसे बुकमार्क या फास्ट-ट्रैवल वेपॉइंट के संग्रह के रूप में उपयोग कर सकते हैं। उदाहरण के लिए, मान लें कि एक सत्र के दौरान आप इस उदाहरण की ~/one/two/three/four/five डायरेक्टरी संरचना के भीतर बहुत काम कर रहे हैं। आप जानते हैं कि आप हाल ही में one पर गए हैं, लेकिन आप याद नहीं कर सकते कि यह आपके pushd स्टैक में कहां स्थित है। आप +0 (वह एक प्लस साइन और शून्य है) आर्गुमेंट के साथ अपना स्टैक देख सकते हैं, जो pushd को आपके स्टैक में किसी भी डायरेक्टरी को बदलने के लिए नहीं कहता, बल्कि pushd को आपके वर्तमान स्टैक को इको करने के लिए प्रेरित करता है:
$ pushd +0
~/one/two/three/four ~/one/two/three ~/one ~/one/two/three/four/five
वैकल्पिक रूप से, आप dirs कमांड के साथ स्टैक देख सकते हैं, और -v विकल्प का उपयोग करके प्रत्येक डायरेक्टरी के लिए इंडेक्स नंबर देख सकते हैं:
$ dirs -v
0 ~/one/two/three/four
1 ~/one/two/three
2 ~/one
3 ~/one/two/three/four/five
आपके स्टैक में पहली प्रविष्टि आपका वर्तमान स्थान है। आप हमेशा की तरह pwd से इसकी पुष्टि कर सकते हैं:
$ pwd
~/one/two/three/four
0 से शुरू (आपका वर्तमान स्थान और आपके स्टैक की पहली प्रविष्टि), आपके स्टैक में दूसरा तत्व ~/one है, जो आपका वांछित गंतव्य है। आप +2 विकल्प का उपयोग करके अपने स्टैक में आगे बढ़ सकते हैं:
$ pushd +2
~/one ~/one/two/three/four/five ~/one/two/three/four ~/one/two/three
$ pwd
~/one
यह आपकी वर्किंग डायरेक्टरी को ~/one में बदलता है और स्टैक को भी शिफ्ट करता है ताकि आपका नया स्थान सामने हो।
आप अपने स्टैक में पीछे भी जा सकते हैं। उदाहरण के लिए, उदाहरण आउटपुट को देखते हुए ~/one/two/three पर जल्दी पहुंचने के लिए, आप एक से पीछे जा सकते हैं, यह ध्यान में रखते हुए कि pushd 0 से शुरू होता है:
$ pushd -0
~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four
स्टैक में जोड़ना
आप इस तरह अपने स्टैक को नेविगेट करना जारी रख सकते हैं, और यह आपके हाल ही में देखी गई डायरेक्टरी की एक स्थिर सूची बनी रहेगी। यदि आप एक डायरेक्टरी जोड़ना चाहते हैं, तो बस डायरेक्टरी का पाथ प्रदान करें। यदि कोई डायरेक्टरी स्टैक में नई है, तो यह सूची में वैसे ही जुड़ जाती है जैसा आप उम्मीद करेंगे:
$ pushd /tmp
/tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four
लेकिन अगर यह पहले से ही स्टैक में मौजूद है, तो यह दूसरी बार जुड़ जाता है:
$ pushd ~/one
~/one /tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four
जबकि स्टैक का उपयोग अक्सर उन डायरेक्टरी की सूची के रूप में किया जाता है जिन तक आप त्वरित पहुंच चाहते हैं, यह वास्तव में आपके द्वारा देखे गए स्थानों का एक सच्चा इतिहास है। यदि आप नहीं चाहते कि कोई डायरेक्टरी स्टैक में अनावश्यक रूप से जुड़े, तो आपको +N और -N नोटेशन का उपयोग करना होगा।
स्टैक से डायरेक्टरी हटाना
आपका स्टैक, जाहिर है, अपरिवर्तनीय नहीं है। आप pushd के साथ इसमें जोड़ सकते हैं या popd के साथ आइटम हटा सकते हैं।
उदाहरण के लिए, मान लें कि आपने अभी pushd का उपयोग करके ~/one को अपने स्टैक में जोड़ा है, जिससे ~/one आपकी वर्तमान वर्किंग डायरेक्टरी बन गई है। पहली (या "ज़ीरोथ," यदि आप पसंद करते हैं) तत्व को हटाने के लिए:
$ pwd
~/one
$ popd +0
/tmp ~/one/two/three ~/one ~/one/two/three/four/five ~/one/two/three/four
$ pwd
~/one
बेशक, आप किसी भी तत्व को हटा सकते हैं, अपनी गिनती 0 से शुरू करके:
$ pwd ~/one
$ popd +2
/tmp ~/one/two/three ~/one/two/three/four/five ~/one/two/three/four
$ pwd ~/one
आप अपने स्टैक के पीछे से popd का उपयोग भी कर सकते हैं, फिर से 0 से शुरू करके। उदाहरण के लिए, अपने स्टैक से अंतिम डायरेक्टरी को हटाने के लिए:
$ popd -0
/tmp ~/one/two/three ~/one/two/three/four/five
इस तरह उपयोग किए जाने पर, popd आपकी वर्किंग डायरेक्टरी को नहीं बदलता। यह केवल आपके स्टैक में हेरफेर करता है।
popd के साथ नेविगेट करना
कोई आर्गुमेंट न दिए जाने पर popd का डिफ़ॉल्ट व्यवहार, आपके स्टैक से पहली (ज़ीरोथ) आइटम को हटाना और अगली आइटम को आपकी वर्तमान वर्किंग डायरेक्टरी बनाना है।
यह क्विक-चेंज कमांड के रूप में सबसे उपयोगी है, जब आप उदाहरण के लिए, दो अलग-अलग डायरेक्टरी में काम कर रहे हैं और बस एक पल के लिए किसी अन्य स्थान पर जाने की आवश्यकता है। यदि आपको विस्तृत इतिहास की आवश्यकता नहीं है तो आपको अपने डायरेक्टरी स्टैक के बारे में सोचने की ज़रूरत नहीं है:
$ pwd
~/one
$ pushd ~/one/two/three/four/five
$ popd
$ pwd
~/one
आपको pushd और popd को त्वरित क्रम में उपयोग करने की भी आवश्यकता नहीं है। यदि आप pushd का उपयोग किसी भिन्न स्थान पर जाने के लिए करते हैं, फिर तीन घंटे के लिए बग का पीछा करते हुए या शोध करते हुए विचलित हो जाते हैं, तो आप पाएंगे कि आपका डायरेक्टरी स्टैक धैर्यपूर्वक इंतजार कर रहा है (जब तक आपने अपना टर्मिनल सत्र समाप्त नहीं किया):
$ pwd ~/one
$ pushd /tmp
$ cd {/etc,/var,/usr}; sleep 2001
[...]
$ popd
$ pwd
~/one
वास्तविक दुनिया में Pushd और popd
pushd और popd कमांड आश्चर्यजनक रूप से उपयोगी हैं। एक बार जब आप उन्हें सीख लेते हैं, तो आप उन्हें अच्छे उपयोग में लाने के बहाने ढूंढ लेंगे, और आप डायरेक्टरी स्टैक की अवधारणा से परिचित हो जाएंगे। pushd के साथ सहज होना वही था जिसने मुझे git stash को समझने में मदद की, जो pushd से पूरी तरह असंबंधित है लेकिन वैचारिक अमूर्तता में समान है।
शेल स्क्रिप्ट में pushd और popd का उपयोग करना आकर्षक हो सकता है, लेकिन आम तौर पर, उनसे बचना शायद सबसे अच्छा है। वे बैश और Zsh के बाहर पोर्टेबल नहीं हैं, और जब आप स्क्रिप्ट को फिर से पढ़ रहे होते हैं तो वे अस्पष्ट हो सकते हैं (pushd +3 cd $HOME/$DIR/$TMP या इसी तरह की तुलना में कम स्पष्ट है)।
इन चेतावनियों के अलावा, यदि आप एक नियमित बैश या Zsh उपयोगकर्ता हैं, तो आप pushd और popd का उपयोग कर सकते हैं और करना चाहिए।