pushd / popd на ksh? - PullRequest
       13

pushd / popd на ksh?

8 голосов
/ 12 июня 2009

Есть ли эквивалент команд сборки bash pushd / popd для KSH?

Для тех, кто не знает, что делают 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:

Спасибо

Ответы [ 4 ]

10 голосов
/ 12 июня 2009

Когда я обнаружил, что 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
}
3 голосов
/ 12 июня 2009

Если у вас все в порядке с одним уровнем отслеживания назад, вы можете использовать псевдоним 'cd -' или 'cd $ OLDPWD' для popd.

Что касается dir.ksh ... согласно Google это часть коммерческого пакета :

Примечание

popd - это определенная функция KornShell в файле

$ROOTDIR/etc/dir.ksh.

Этот файл обычно обрабатывается вход в оболочку во время обработки файл $ ROOTDIR / etc / profile.ksh. Если ваша система не может распознать попд команда, проверь свой профиль.кш файл, чтобы убедиться, что вызов dir.ksh включен.

ДОСТУПНОСТЬ

Инструментарий MKS для опытных пользователей MKS Инструментарий для системных администраторов МКС Инструментарий для разработчиков MKS Инструментарий для Функциональная совместимость MKS Toolkit для Профессиональные разработчики MKS Toolkit для разработчиков предприятий MKS Toolkit для корпоративных разработчиков 64-бит Edition

2 голосов
/ 12 июня 2009

Я обычно использую подоболочку для такого рода вещей:

(cd tmp; echo "test" >tmpfile)

Это изменится на каталог tmp и создаст файл с именем tmpfile в этом каталоге. После возвращения подоболочки текущий каталог восстанавливается до того, что был до запуска подоболочки. Это связано с тем, что каждый экземпляр оболочки имеет собственное представление о том, что такое «текущий каталог», и изменение текущего каталога в подоболочке не влияет на оболочку, которая его назвала.

0 голосов
/ 12 июня 2009

Если вашей системе не удается распознать команду pushd, проверьте файл profile.ksh, чтобы убедиться, что в него включен вызов dir.ksh.

...