Xref: utzoo comp.unix.shell:320 alt.sources:2369 Path: utzoo!utgpu!cs.utexas.edu!sun-barr!apple!amdcad!pyramid!unify!jwc From: jwc@Unify.Com (J. William Claypool) Newsgroups: comp.unix.shell,alt.sources Subject: Re: Pushd, popd, dirs for stock SysV.3 Bourne shell Message-ID: Date: 27 Sep 90 19:51:30 GMT References: Organization: Unify Corporation, Sacramento, CA, USA Lines: 133 In article pcg@cs.aber.ac.uk (Piercarlo Grandi) writes: > >You wwill find appended a small shell script that defines under a stock >System V Bourne shell the pushd, popd, dirs commands of csh(1). They are >trivially adapted to the Korn shell. I have taken care to make them as >robust as possible. Well... since you mentioned it... Here is an implementation of directory stack for SysV Bourne shell which I've had floating around for a while. I took a similar approach. I didn't make any attempt to handle space in a directory name. I believe that it duplicates the full functionality of csh. It also initializes the directory stack from $HOME/.dirstk if that file is present. -------------------- cut here -------------------- dirs(){ case $# in 0) echo `pwd` $dirstk | sed -e "s;$HOME;~;g" -e 'y/\ /\\n/' | nl -v0 ;; 1) case $1 in -l) echo `pwd` $dirstk ;; *) echo "usage: dirs [ -l ]" ;; esac ;; *) echo "usage: dirs [ -l ]" ;; esac } popd(){ case $# in 0) set $dirstk case $# in 0) echo "popd: Directory stack is empty." ;; *) if eval cd $1 ; then shift dirstk="$*" dirs fi esac ;; 1) case $1 in +[0-9]|+[0-9][0-9]) cnt=`echo $1 | sed -e 's;+;;'` set $dirstk case $cnt in 0|00) if eval cd $1 ; then shift dirstk="$*" dirs fi ;; *) if [ $# -ge $cnt ] ; then svdirs= while [ $cnt -gt 1 ] ; do svdirs="$svdirs $1" shift cnt=`expr $cnt - 1` done shift dirstk="$svdirs $*" dirs else echo "popd: Directory stack not that deep." fi ;; esac ;; *) echo "usage: popd [ +n ]" ;; esac ;; *) echo "usage: popd [ +n ]" ;; esac } pushd(){ case $# in 0) set $dirstk case $# in 0) ;; *) d1=`pwd` if eval cd $1 ; then shift dirstk="$d1 $*" dirs fi ;; esac ;; 1) case $1 in +[0-9]|+[0-9][0-9]) cnt=`echo $1 | sed -e 's;+;;'` set $dirstk if [ $# -ge $cnt ] ; then svdirs=`pwd` while [ $cnt -gt 1 ] ; do svdirs="$svdirs $1" shift cnt=`expr $cnt - 1` done if eval cd $1 ; then shift dirstk="$* $svdirs" dirs fi else echo "pushd: Directory stack not that deep." fi ;; +*) echo "usage: pushd [ +n | ]" ;; *) dirstk="`pwd` $dirstk" if eval cd `echo $1 | sed -e "s;~;$HOME;"` ; then dirs else set $dirstk shift $dirstk="$*" fi ;; esac ;; *) echo "usage: pushd [ +n | ]" ;; esac } svds(){ dirs -l > $HOME/.dirstk } if [ -s $HOME/.dirstk ] ; then dirstk=`cat $HOME/.dirstk` popd else dirstk= fi -------------------- cut here -------------------- -- Bill Claypool +1 916 920 1830 x341| I know what I know if you know what I mean jwc@Unify.Com |-------------------------------------------- ...!{csusac,pyramid}!unify!jwc | SCCA SFR Solo II 74 es 1984 CRX 1.5