在KSH的命令中是否有相当于bash pushd / popd的内置版本?
对于那些不知道bash中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:
谢谢
当我发现ksh不包括这些时,我写了自己的.我把它放在〜/ bin / dirstack.ksh中,我的.kshrc文件包含它:
原文链接:https://www.f2er.com/bash/385028.html. ~/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 }