Frage

Gibt es ein Äquivalent der bash pushd / popd Build in Befehle für den KSH?

Für diejenigen, die nicht wissen, was pushd und popd in bash zu tun, hier ist die Beschreibung des Mannes Seite

   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:

Danke

War es hilfreich?

Lösung

Als ich entdeckte, dass KSH diese nicht enthalten waren, schrieb ich meine eigene. Ich habe dies in ~/bin/dirstack.ksh und meine .kshrc Datei enthält es wie folgt aus:

. ~/bin/dirstack.ksh

Hier ist der Inhalt von 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
}

Andere Tipps

Wenn Sie sind OK mit nur einer einzigen Ebene der Verfolgung, können Sie alias 'cd -'. 'Oder' cd $ OLDPWD'popd

Wie bei dir.ksh ... nach Google es Teil einer kommerzielles Paket :

  

Hinweis

     

popd ist eine Kornshell-Funktion definiert   in der Datei

$ROOTDIR/etc/dir.ksh.
     

Diese Datei wird in der Regel durch ein verarbeitetes   Login-Shell während der Verarbeitung   Die Datei $ ROOTDIR / etc / profile.ksh. Wenn   Ihr System versagt das erkennen,   popd Befehl, überprüfen Sie Ihre profile.ksh   Datei, um sicherzustellen, dass ein Aufruf dir.ksh   enthalten ist.

     

Verfügbarkeit

     

MKS Toolkit for Power Users MKS   Toolkit für Systemadministratoren MKS   Toolkit für Entwickler MKS Toolkit for   Interoperabilität MKS Toolkit for   Professional Developers MKS Toolkit   für Enterprise-Entwickler MKS Toolkit   for Enterprise Developers 64-Bit   Ausgabe

ich in der Regel ein Sub-Shell für diese Art der Sache verwenden:

(cd tmp; echo "test" >tmpfile)

Dies ändert sich mit dem tmp Verzeichnis und erstellt eine Datei tmpfile in diesem Verzeichnis. Nach dem Subshell zurückgibt, wird das aktuelle Verzeichnis wieder zu dem, was es war, bevor die Subshell gestartet. Dies liegt daran, dass jede Schale Instanz eine eigene Idee hat, was das „aktuelle Verzeichnis“ ist, und in einer Subshell das aktuelle Verzeichnis ändert nicht die Schale, die sie aufgerufen.

Es gibt einen subtilen Fehler in der akzeptierten Antwort . Wenn ‚pushd‘ ohne arg aufgerufen wird (1 $ = „“) und eine leere DIR_STACK spritzt es einen leeren Eintrag in dem Stapel, die nicht sein kann „knallte“ aus. den Rand Fall fangen scheint es zu beheben.

Hier ist der korrigierte Code. EDIT: zu stderr beschweren, wenn nirgends zu schieben (in Übereinstimmung w / bash pushd). Links die indizierte Eintrag auf ‚dirs‘, wie ich glaube, es ist eine Verbesserung: ')

# 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" =======
      # swap only if there's a value to swap with
      if [ ${#dir_stack[*]} = "0" ]; then
         echo "ksh: pushd: no other directory" >&2
      else
         cd ${dir_stack[sd]}       # Swap stack top with +1 position
         dir_stack[sd]=$OLDPWD
      fi
   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
}

Wenn Sie Ihr System nicht den Befehl Pushd erkennen, überprüfen Sie Ihre profile.ksh Datei, um sicherzustellen, dass ein Aufruf dir.ksh enthalten ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top