2009-06-12 8 views
8

Existe-t-il un équivalent des commandes bash pushd/popd pour le KSH?pushd/popd sur ksh?

Pour ceux qui ne savent pas ce que pushd et popd en bash faire, voici la description de la page 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: 

Merci

+0

Une excellente installation 'pushd' /' popd' apparaît [ici] (http://blogs.oracle.com/nico/entry/ksh_functions_gal ore) dans l'un des blogs d'Oracle - probablement lié à son utilisation dans Solaris. – Mei

Répondre

10

Lorsque j'ai découvert que ksh ne les incluait pas, j'ai écrit le mien. Je mets cela dans ~/bin/dirstack.ksh et mon dossier .kshrc il comprend comme ceci:

. ~/bin/dirstack.ksh 

Voici le contenu 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

Cela semble être la réponse la plus prometteuse, je vais essayer après le déjeuner – hhafez

+0

J'espère que cela fonctionne pour vous. Je l'utilise depuis plus d'une décennie. Il ne reproduit pas * exactement * le comportement du répertoire pushd/popd/construit dans csh/bash, mais il est très proche. – Eddie

+0

Très bien. Je viens de le trouver aujourd'hui et je vais l'installer en standard sur les systèmes Ksh avec lesquels je travaille. :) –

2

j'utilise un sous-shell pour ce genre de chose:

(cd tmp; echo "test" >tmpfile) 

Cela change le répertoire tmp et crée un fichier appelé tmpfile dans ce répertoire. Après le retour du sous-shell, le répertoire en cours est restauré à ce qu'il était avant le démarrage du sous-shell. C'est parce que chaque instance de shell a sa propre idée de ce qu'est le "répertoire courant", et changer le répertoire courant dans un sous-shell n'affecte pas le shell qui l'a appelé.

0

Si votre système ne reconnaît pas la commande pushd, vérifiez votre fichier profile.ksh pour vous assurer qu'un appel à dir.ksh est inclus.

+0

qu'est-ce que dir.ksh? – hhafez

+0

pushd est une fonction shell définie dans le fichier $ ROOTDIR/etc/dir.ksh. –

+0

Pas sur un serveur Solaris que j'ai à portée de main. Premièrement, je n'ai pas défini $ ROOTDIR, et deuxièmement,/etc ne contient pas de fichiers * .ksh. – Eddie

3

Si vous êtes OK avec juste un seul niveau de retour vous suivi peut alias 'cd -' ou 'cd $ OLDPWD' à popd.

Quant à dir.ksh ... selon Google, il fait partie d'un commercial package:

NOTE

popd est une fonction définie KornShell dans le fichier

$ROOTDIR/etc/dir.ksh. 

Cette Le fichier est normalement traité par un shell de connexion lors du traitement de le fichier $ ROOTDIR/etc/profile.ksh. Si votre système ne reconnaît pas la commande popd, vérifiez votre fichier profile.ksh pour vous assurer qu'un appel à dir.ksh est inclus.

DISPONIBILITÉ

MKS Toolkit pour les utilisateurs MKS Toolkit pour les administrateurs système MKS Toolkit pour les développeurs MKS Toolkit pour interopérabilité MKS Toolkit pour Professional Developers MKS Toolkit pour les développeurs Enterprise MKS Toolkit pour l'entreprise Les développeurs 64- Bit Edition

+0

J'utilise cd - mais parfois j'ai besoin de plus :) – hhafez

+1

Le nom 'dir.sh' est suffisamment générique pour qu'il puisse être partout. De plus, je ne pense pas que la boîte à outils MKS soit plus disponible. – Mei

Questions connexes