Pushd, popd, dirs for stock SysV.3 Bourne shell
David Barto
barto at megatek.UUCP
Fri Sep 28 02:19:05 AEST 1990
In article <PCG.90Sep26164749 at odin.cs.aber.ac.uk> pcg at cs.aber.ac.uk (Piercarlo Grandi) writes:
>
>You will 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.
>
pushd, popd, and dirs --- written by Chris Bertin
Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris
as modified by Patrick Elam of GTRI
modified by david barto to allow 'pushd +n'
cd is a function, which uses the 'builtin' keyword, available for
those who have the BRL mods to the shell. (I think this can be changed
to 'eval'.) It will look for PCDPATH and do chdirs down that path if
the directory can be found on it.
PCDPATH=". $HOME /burt/prj/common /burt/prj/sparc /archive2"
export PCDPATH
-----
cd () {
PREVDIR="$CWD"
result=1
if [ $# -lt 1 ] ; then
builtin cd
result=0
elif [ -d $1 ] ; then
builtin cd "$1"
result=0
else
for i in $PCDPATH
do
nxtdir=$i/$1
# echo "try $nxtdir"
if [ $result != 0 -a -d $nxtdir ] ; then
builtin cd "$nxtdir"
result=0
fi
done
unset nxtdir
fi
if [ $result != 0 ] ; then
echo "$1: directory not found"
else
CWD=`pwd` export CWD
set +u
if [ "$CWD" = "$HOME" ]
then
PFX="$HOST"
PS1=:~
else
PS1=`echo "$CWD" | sed -e "s!^$HOME!~!"` PFX="$HOST":
fi
umask 022
echo "$CWD" | egrep -s "/burt/prj/common|/x"
[ $? = 0 ] && umask 002
if [ "$TERM" = "wy75" ]
then
wy75-title $PS1
PS1="$PFX %e_ "
elif [ "$TWM_RUNNING" = 1 ]
then
if [ "$TTY" != "" ]
then
twm-title "$TTY:$PFX$PS1"
else
twm-title "XX:$PFX$PS1"
fi
PS1="%e_ "
else
PS1="$PFX$PS1 %t%n%e_ "
fi
unset PFX
set -u
fi
return $result
}
# pushd, popd, and dirs --- written by Chris Bertin
# Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris
# as modified by Patrick Elam of GTRI
# modified by david barto to allow 'pushd +n'
pushd () {
SAVE=`pwd`
_DSTACK="$SAVE $_DSTACK"
if [ "$1" = "" ]
then
if [ "$_DSTACK" = "$SAVE " ]
then
echo "pushd: directory stack empty."
_DSTACK=""
return 1
fi
set $_DSTACK
cd $2
set $_DSTACK
shift 2
_DSTACK="$SAVE $*"
else
case "$1" in
+*)
count=`echo $1 | sed 's/+//'`
set $_DSTACK
if [ $count -ge $# ] ; then
echo "pushd: directory stack not that deep"
shift
_DSTACK=$*
return 1
fi
TMP=
while [ $count -gt 0 ]
do
TMP="$TMP $1"
shift
count=`expr $count - 1`
done
TD=$1
shift
_DSTACK="$TMP $*"
unset TMP
if [ -d $TD ]
then
cd $TD >&-
unset TD
else
popd > /dev/null
return 1
fi
;;
*)
cd $1
if [ $? -eq 1 ] ; then
popd > /dev/null
return 1
fi
;;
esac
fi
dirs
return 0
}
popd () {
if [ "$_DSTACK" = "" ]; then
echo "popd: Directory stack empty"
return 1
fi
case "$1" in
+*)
count=`echo $1 | sed 's/+//'`
case "$count" in
0)
echo "popd: Must have positive count"
return 1
;;
1)
popd
return 0
;;
*)
_TMPSTK="`pwd` $_DSTACK"
set $_TMPSTK
if [ $count -gt $# ]; then
echo "pushd: directory stack not that deep"
return 1
fi
TMP=
while [ $count -ge 1 ]
do
TMP="$TMP $1"
shift
count=`expr $count - 1`
done
shift # trash dir requested
_DSTACK="$* $TMP"
set $_DSTACK
shift # trash 'pwd' from the top of the stack
_DSTACK="$*"
;;
esac
;;
*)
set $_DSTACK
cd $1
set $_DSTACK
shift
_DSTACK=$*
;;
esac
dirs
return 0
}
dirs () {
echo "`pwd` $_DSTACK"
return 0
}
xchng () { # exchanged top two entries on the stack
if [ "$_DSTACK" = "" ]
then
echo exchange directory stack empty
return 1
else
pushd
return 0
fi
}
--
David Barto uunet!megatek!barto barto at network.ucsd.edu
More information about the Alt.sources
mailing list