2009-06-12 9 views
8

¿Hay un equivalente de la compilación bash pushd/popd en los comandos para KSH?pushd/popd en ksh?

Para aquellos que no saben lo que pushd y popd en bash hacer, aquí es la descripción de la página man

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: 

Gracias

+0

Aparece una excelente instalación 'pushd' /' popd' [aquí] (http://blogs.oracle.com/nico/entry/ksh_functions_gal) mineral) en uno de los blogs de Oracle, presumiblemente relacionado con su uso en Solaris. – Mei

Respuesta

10

Cuando descubrí que ksh no incluía estos, escribí el mío. Pongo esto en ~/bin/dirstack.ksh y mi archivo .kshrc incluye así:

. ~/bin/dirstack.ksh 

Éstos son los contenidos de 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 
} 
+0

Esto parece ser la respuesta más prometedora, voy a intentarlo después del almuerzo – hhafez

+0

Espero que funcione para usted. Lo he usado por más de una década. No * exactamente * reproduce el comportamiento de pushd/popd/dirs integrado en csh/bash, pero está muy cerca. – Eddie

+0

Muy agradable. Lo acabo de encontrar hoy y lo voy a configurar de manera estándar en los sistemas ksh con los que trabajo. :) –

2

lo general el uso de un subnivel para este tipo de cosas:

(cd tmp; echo "test" >tmpfile) 

Esto cambia al directorio tmp y crea un archivo llamado tmpfile en ese directorio. Después de que la subshell regrese, el directorio actual se restaura a lo que era antes de que comenzara la subshell. Esto se debe a que cada instancia de shell tiene su propia idea de lo que es el "directorio actual", y cambiar el directorio actual en una subshell no afecta al shell que lo llamó.

0

Si su sistema no reconoce el comando pushd, verifique su archivo profile.ksh para asegurarse de que se incluye una llamada a dir.ksh.

+0

¿Qué es dir.ksh? – hhafez

+0

pushd es una función de shell definida en el archivo $ ROOTDIR/etc/dir.ksh. –

+0

No en ningún servidor Solaris que tenga a mano. Primero, no tengo $ ROOTDIR definido, y segundo,/etc no tiene CUALQUIER archivo * .ksh. – Eddie

3

Si estás bien con un solo nivel de la espalda de seguimiento puede alias 'cd -' o 'cd $ OLDPWD' para popd.

En cuanto a dir.ksh ... según Google Es parte de un commercial package:

NOTA

popd se define una función KornShell en el archivo

$ROOTDIR/etc/dir.ksh. 

Este el archivo normalmente se procesa mediante un shell de inicio de sesión durante el procesamiento de el archivo $ ROOTDIR/etc/profile.ksh. Si su sistema no reconoce el comando popd , verifique su archivo profile.ksh para asegurarse de que se incluye una llamada a dir.ksh .

DISPONIBILIDAD

MKS Toolkit para usuarios avanzados MKS Toolkit para administradores de sistemas MKS Toolkit para Desarrolladores MKS Toolkit para Interoperabilidad MKS Toolkit para Desarrolladores Profesionales MKS Toolkit de Empresa Desarrolladores MKS Toolkit de Empresa Desarrolladores 64- Bit Edición

+0

Uso cd, pero a veces necesito más :) – hhafez

+1

El nombre 'dir.sh' es lo suficientemente genérico como para abarcar todo el lugar. Además, no creo que el conjunto de herramientas de MKS esté más cerca. – Mei

Cuestiones relacionadas