2009-06-12 47 views
8

在KSH的命令中是否有相當於bash pushd/popd的構建?在ksh上pushd/popd?

對於那些誰不知道什麼pushd和popd命令在bash做,這裏是從該名男子頁的說明

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礦石)在Oracle的其中一個博客中 - 可能與其在Solaris中的使用有關。 – Mei 2012-01-13 17:29:48

回答

10

當我發現ksh沒有包括這些,我寫了我自己的。我把這個~/bin/dirstack.ksh和我.kshrc文件包括這樣的:

. ~/bin/dirstack.ksh 

這裏是dirstack.ksh內容:

# 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 
} 
2

我通常使用一個子shell爲這樣的事情:

(cd tmp; echo "test" >tmpfile) 

這改變到tmp目錄,並創建了一個名爲tmpfile在該目錄中的文件。子shell返回後,當前目錄將恢復到子shell啓動之前的狀態。這是因爲每個shell實例對「當前目錄」是什麼都有自己的想法,並且在子shell中更改當前目錄不會影響調用它的shell。

0

如果您的系統無法識別pushd命令,請檢查您的profile.ksh文件以確保包含對dir.ksh的調用。

+0

dir.ksh是什麼? – hhafez 2009-06-12 01:43:50

+0

pushd是在$ ROOTDIR/etc/dir.ksh文件中定義的shell函數。 – 2009-06-12 01:48:32

+0

不適用於我有用的任何Solaris服務器。首先,我沒有定義$ ROOTDIR,其次,/ etc中沒有任何* .ksh文件。 – Eddie 2009-06-12 01:53:07

3

如果你是回來的只是一個單一的級別確定跟蹤你可以別名'cd - '或'cd $ OLDPWD'彈出。

至於dir.ksh ......根據谷歌這是一個commercial package的一部分:

注意

POPD是KornShell函數的文件

$ROOTDIR/etc/dir.ksh. 

這個定義 文件通常在 文件$ ROOTDIR/etc/profile.ksh的處理過程中由 登錄shell進行處理。如果 系統無法識別彈出式命令 ,請檢查您的配置文件.ksh 文件以確保包含對dir.ksh 的調用。

可用性

MKS工具包的高級用戶MKS 工具包,系統管理員MKS 工具包,開發人員MKS工具包 互操作性MKS工具包 專業開發者MKS工具箱 爲企業開發人員MKS工具箱 爲企業開發人員64位 版本