2009-06-12 7 views
8

क्या केएसएच के लिए कमांड में बैश पुश/पॉपड बिल्ड के बराबर है?ksh पर pushd/popd?

उन बैश में क्या pushd और popd करना नहीं जानते हैं, जो के लिए, यहाँ आदमी पृष्ठ से वर्णन है

pushd [-n] [dir] 
    pushd [-n] [+n] [-n] 
      Adds a directory to the top of the directory stack, or rotates 
      the stack, making the new top of the stack the current working 
      directory. With no arguments, exchanges the top two directo- 
      ries and returns 0, unless the directory stack is empty. 


    popd [-n] [+n] [-n] 
      Removes entries from the directory stack. With no arguments, 
      removes the top directory from the stack, and performs a cd to 
      the new top directory. Arguments, if supplied, have the fol- 
      lowing meanings: 

धन्यवाद

+0

एक उत्कृष्ट 'pushd' /' popd' स्थापना प्रकट होता है [यहां] (http://blogs.oracle.com/nico/entry/ksh_functions_gal अयस्क) ओरेकल के ब्लॉगों में से एक - शायद सोलारिस में इसके उपयोग से संबंधित है। – Mei

उत्तर

10

जब मुझे पता चला कि क्ष में इन्हें शामिल नहीं किया गया है, तो मैंने अपना खुद लिखा था। मैं ~/bin/dirstack.ksh में रखते और मेरी .kshrc फ़ाइल इस तरह यह भी शामिल है: यदि आप ट्रैकिंग कर सकते हैं उर्फ ​​

# Implement a csh-like directory stack in ksh 
# 
# environment variable dir_stack contains all directory entries except 
# the current directory 

unset dir_stack 
export dir_stack 


# Three forms of the pushd command: 
# pushd  - swap the top two stack entries 
# pushd +3  - swap top stack entry and entry 3 from top 
# pushd newdir - cd to newdir, creating new stack entry 

function pushd 
{ 
    sd=${#dir_stack[*]} # get total stack depth 
    if [ $1 ] ; then 
     if [ ${1#\+[0-9]*} ] ; then 
     # ======= "pushd dir" ======= 

     # is "dir" reachable? 
     if [ `(cd $1) 2>/dev/null; echo $?` -ne 0 ] ; then 
      cd $1    # get the actual shell error message 
      return 1   # return complaint status 
     fi 

     # yes, we can reach the new directory; continue 

     ((sd = sd + 1))  # stack gets one deeper 
     dir_stack[sd]=$PWD 
     cd $1 
     # check for duplicate stack entries 
     # current "top of stack" = ids; compare ids+dsdel to $PWD 
     # either "ids" or "dsdel" must increment with each loop 
     # 
     ((ids = 1))   # loop from bottom of stack up 
     ((dsdel = 0))  # no deleted entries yet 
     while [ ids+dsdel -le sd ] ; do 
      if [ "${dir_stack[ids+dsdel]}" = "$PWD" ] ; then 
       ((dsdel = dsdel + 1)) # logically remove duplicate 
      else 
       if [ dsdel -gt 0 ] ; then  # copy down 
        dir_stack[ids]="${dir_stack[ids+dsdel]}" 
       fi 
       ((ids = ids + 1)) 
      fi 
     done 

     # delete any junk left at stack top (after deleting dups) 

     while [ ids -le sd ] ; do 
      unset dir_stack[ids] 
      ((ids = ids + 1)) 
     done 
     unset ids 
     unset dsdel 
     else 
     # ======= "pushd +n" ======= 
     ((sd = sd + 1 - ${1#\+})) # Go 'n - 1' down from the stack top 
     if [ sd -lt 1 ] ; then ((sd = 1)) ; fi 
     cd ${dir_stack[sd]}   # Swap stack top with +n position 
     dir_stack[sd]=$OLDPWD 
     fi 
    else 
     # ======= "pushd" ======= 
     cd ${dir_stack[sd]}  # Swap stack top with +1 position 
     dir_stack[sd]=$OLDPWD 
    fi 
} 

function popd 
{ 
    sd=${#dir_stack[*]} 
    if [ $sd -gt 0 ] ; then 
     cd ${dir_stack[sd]} 
     unset dir_stack[sd] 
    else 
     cd ~ 
    fi 
} 

function dirs 
{ 
    echo "0: $PWD" 
    sd=${#dir_stack[*]} 
    ((ind = 1)) 
    while [ $sd -gt 0 ] 
    do 
     echo "$ind: ${dir_stack[sd]}" 
     ((sd = sd - 1)) 
     ((ind = ind + 1)) 
    done 
} 
+0

यह सबसे आशाजनक प्रतिक्रिया की तरह लगता है, मैं दोपहर के भोजन के बाद कोशिश करूंगा – hhafez

+0

मुझे आशा है कि यह आपके लिए काम करेगा। मैं इसे एक दशक से अधिक समय से उपयोग कर रहा हूं। यह * बिल्कुल * csh/bash में निर्मित pushd/popd/dirs के व्यवहार को पुन: उत्पन्न नहीं करता है, लेकिन यह बहुत करीब है। – Eddie

+0

बहुत अच्छा। मैंने अभी यह पाया है और इसे केश सिस्टम पर मानक के रूप में स्थापित किया जाएगा जिसके साथ मैं काम करता हूं। :) –

2

मैं आमतौर पर बात की इस तरह के लिए एक subshell का उपयोग करें:

(cd tmp; echo "test" >tmpfile) 

यह tmp निर्देशिका में परिवर्तन और एक फ़ाइल है कि निर्देशिका में tmpfile कहा जाता है बनाता है। सबहेल रिटर्न के बाद, मौजूदा निर्देशिका को पुन: स्थापित किया जाता है जो सबस्केल शुरू होने से पहले था। ऐसा इसलिए है क्योंकि प्रत्येक शेल इंस्टेंस का अपना विचार है कि "वर्तमान निर्देशिका" क्या है, और उपशीर्षक में वर्तमान निर्देशिका को बदलना उस शेल को प्रभावित नहीं करता है जिसे इसे कहा जाता है।

0

यदि आपका सिस्टम pushd कमांड को पहचानने में विफल रहता है, तो यह सुनिश्चित करने के लिए कि dir.ksh को कॉल शामिल है, अपनी प्रोफ़ाइल.केश फ़ाइल जांचें।

+0

dir.ksh क्या है? – hhafez

+0

पुशड फ़ाइल $ ROOTDIR/etc/dir.ksh फ़ाइल में परिभाषित एक खोल फ़ंक्शन है। –

+0

किसी भी Solaris सर्वर पर नहीं है मेरे पास आसान है। सबसे पहले, मेरे पास $ ROOTDIR परिभाषित नहीं है, और दूसरा,/आदि में इसमें कोई भी * .ksh फ़ाइलें नहीं हैं। – Eddie

3

तुम वापस की बस एक स्तर के साथ ठीक कर रहे हैं:

. ~/bin/dirstack.ksh 

यहाँ dirstack.ksh की सामग्री हैं पॉप-अप करने के लिए 'सीडी -' या 'सीडी $ OLDPWD'।

नोट

popd एक के शेल समारोह फ़ाइल

$ROOTDIR/etc/dir.ksh. 

इस में परिभाषित किया गया है:

dir.ksh के लिए के रूप में ... गूगल के अनुसार यह एक commercial package का हिस्सा है फ़ाइल को लॉगिन शेल फ़ाइल $ ROOTDIR/etc/profile.ksh की प्रसंस्करण के दौरान सामान्य रूप से संसाधित किया जाता है। यदि आपकी प्रणाली पॉपड कमांड को पहचानने में विफल रही है, तो dir.ksh पर कॉल सुनिश्चित करने के लिए अपनी प्रोफ़ाइल .ksh फ़ाइल देखें।

उपलब्धता

पावर उपयोगकर्ता MKS प्रणाली प्रशासक MKS उद्यम डेवलपर्स के लिए उद्यम डेवलपर्स MKS टूलकिट के लिए के लिए व्यावसायिक डेवलपर्स MKS इंटरोऑपरेबिलिटी MKS टूलकिट टूलकिट के लिए डेवलपर्स MKS टूलकिट के लिए टूलकिट के लिए टूलकिट के लिए MKS टूलकिट 64 बिट संस्करण

+0

मैं सीडी का उपयोग करता हूं - लेकिन कभी-कभी मुझे और चाहिए :) – hhafez

+1

नाम 'dir.sh' सामान्य है कि यह सब जगह पर हो सकता है। और क्या है, मुझे नहीं लगता कि एमकेएस टूलकिट अब और आसपास है। – Mei

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