2012-03-28 2 views
5

मुझे नहीं पता कि ऐसा करने का कोई वैध तरीका है या नहीं। लेकिन, हमेशा यह देखना चाहता था कि यह संभव है या नहीं।pushd popd वैश्विक निर्देशिका ढेर?

मुझे पता है कि pushd, popd और dirs कई चीजों के लिए उपयोगी हैं जैसे कि हाल ही में देखी गई निर्देशिकाओं के बीच प्रतिलिपि बनाना।

लेकिन, क्या कोई तरीका है जिसमें आप वैश्विक ढेर रख सकते हैं? इसलिए यदि मैं एक टर्मिनल में कुछ (पुशड का उपयोग करके) दबाता हूं तो यह दूसरे में दिखाई देता है (शायद उस लॉगिन सत्र में केवल टर्मिनल)।

+0

पुशड और पॉपड अंतर्निहित कमांड हैं और डीआईआर स्टैक प्रत्येक खोल प्रक्रिया द्वारा बनाए रखा जाता है। हां, वैश्विक ढेर रखने का एक तरीका है। वास्तव में कई तरीके। क्या आपने कुछ भी अपनाया है? –

उत्तर

4

आपको खोल कार्यों और एक अस्थायी फ़ाइल की एक जोड़ी के साथ ऐसा करने में सक्षम होना चाहिए।

आपका अस्थायी फ़ाइल '/home/me/.directory_stack' की तरह कुछ नामित किया जाएगा और केवल निर्देशिका की सूची हो जाएगा:

/home/me 
/etc 
/var/log 

आपका 'push_directory' समारोह बस अपनी सूची में वर्तमान निर्देशिका जोड़ना होगा। 'Pop_directory' फ़ंक्शन सबसे हालिया सूची को बंद कर देगा और उस निर्देशिका पर स्विच करेगा। इस तरह की फाइल में ढेर को संग्रहीत करना सुनिश्चित करता है कि जानकारी सभी खुले टर्मिनल (और यहां तक ​​कि रीबूट के पार भी) में मौजूद है।

directory_stack=/home/me/.directory_stack 
function push_dir() { 
    echo $(pwd) >> $directory_stack 
    cd $1 
} 
function pop_dir() { 
    [ ! -s $directory_stack ] && return 
    newdir=$(sed -n '$p' $directory_stack) 
    sed -i -e '$d' $directory_stack 
    cd $newdir 
} 

अपने .bashrc है कि जोड़ें और वे स्वचालित रूप से हर बार जब आप खोल में लॉग इन परिभाषित कर दिया जाएगा:

यहां कुछ उदाहरण कार्य (केवल हल्के से परीक्षण किया चेतावनी) कर रहे हैं।

+0

बह, ऐसा लगता है कि सरनोल्ड का एक ही विचार था कि मैंने किया और मुझे पंच पर मार दिया। मैं अपना जवाब छोड़ दूंगा क्योंकि यह एक अलग तकनीक का उपयोग करता है, लेकिन रिकॉर्ड के लिए वह पहले था। – bta

+0

'sed' $ p'' और 'sed' $ d''प्रोग्राम _perfect_ हैं; मेरे भयानक अंकगणित से बहुत अच्छा है। मुझे लगता है कि मानक यूनिक्स उपकरण को फ़ाइल की अंतिम पंक्ति को हटाने और वापस करने के लिए एक आसान तंत्र होना चाहिए ... – sarnold

3

आप शायद कुछ खोल कार्यों लिखने और उन्हें pushd और popd के स्थान पर उपयोग करने के लिए चाहता हूँ।

mypushd() { echo "$1" >> ~/.dir_stack ; cd "$1" } 
mypopd() { dir=`tail -1 ~/.dir_stack` ; cd "$dir" ; 
      foo=`wc -l ~/.dir_stack | egrep -o '[0-9]+'` ; 
      ((foo=$foo-1)) ; 
      mv ~/.dir_stack ~/.dir_stack_old ; 
      head -n $foo ~/.dir_stack_old > ~/.dir_stack } 

आप भद्दा बिट्स के कुछ से छुटकारा पाने सकता है यदि आप एक छोटे प्रोग्राम है जो वापस आती है और फ़ाइल की अंतिम पंक्ति को हटा लिखें: जैसे निम्नलिखित (untested) कार्यों कुछ काम कर सकता है।

+0

धन्यवाद! यह तेज़ और सरल लगता है। यदि आवश्यक हो तो मैं इसे पायथन/पर्ल में डुप्लिकेट करने का प्रयास करूंगा। मैं शुरुआत में सोच रहा था कि क्या बैश के पास ऐसा करने के लिए कुछ पर्यावरण चर था। मुझे लगता है कि मामला नहीं है। –

+0

पायथन या पर्ल में इसे फिर से करने की कोशिश करने में समस्या यह है कि 'chdir (2) 'सिस्टम कॉल केवल वर्तमान प्रक्रिया को प्रभावित कर सकता है। यदि आप वास्तव में इसे पायथन में चाहते हैं, तो आप [IPython] (http://ipython.org/) को भी देखना चाहेंगे - मुझे लगता है कि यह इंटरैक्टिव कंप्यूटिंग कार्यों के लिए एक शेल प्रतिस्थापन होने का प्रयास करता है। लेकिन अगर आप अपने खोल का उपयोग करना चाहते हैं, तो किसी भी अन्य भाषा में इन कार्यों को पुन: उत्पन्न करने का प्रयास करने में किसी भी समय बर्बाद न करें - [बीटीए का उत्तर] (http://stackoverflow.com/a/9916812/377270) शायद सबसे अच्छा है आप बिना किसी काम के कर सकते हैं। – sarnold

संबंधित मुद्दे