Article View: gnu.bash.bug
Article #861complex functions
From: David Becker
Date: Tue, 23 Jan 1990 17:13
Date: Tue, 23 Jan 1990 17:13
147 lines
3241 bytes
3241 bytes
I have a script from a friend that gives cd a history in ksh. I've
found it handier than CDPATH. Anyways bash barfs.
In particular it doesn't take the typedef flags which isn't too big a
deal but it also won't swallow ((i=cdlen)). The double parentheses cause a
syntax error.
Should in its present incarnation handle this stuff(ie there's a bug) or
is bash not up to these functions yet? The texinfo on bash shell
scripts didn't say much.
The first syntax error occurs on line 38 at the ((
#
# CD History function originally by Shane McCaron
# external shell variables
# CDHISTFILE - where you want the history kept
#
alias cd=_cd
function _cd
{
typeset -i cdlen i
typeset t
if [ $# -eq 0 ]
then
set -- $HOME
fi
if [ "$CDHISTFILE" -a -r "$CDHISTFILE" ] # if directory history exists
then
typeset CDHIST
i=-1
while read -r t # read directory history file
do
CDHIST[i=i+1]=$t
done <$CDHISTFILE
fi
if [ "${CDHIST[0]}" != "$PWD" -a "$PWD" != "" ]
then
_cdins # insert $PWD into cd history
fi
cdlen=${#CDHIST[*]} # number of elements in history
case "$@" in
-) # cd to new dir
if [ "$OLDPWD" = "" ] && ((cdlen>1)) # SYNTAX HERE from BASH
then
print ${CDHIST[1]}
'cd' ${CDHIST[1]}
else
'cd' $@
fi
;;
-l) # print directory list
typeset -R3 num
((i=cdlen))
while (((i=i-1)>=0))
do
num=$i
print "$num ${CDHIST[i]}"
done
return
;;
-[0-9]|-[0-9][0-9]) # cd to dir in list
if (((i=${1#-})<cdlen))
then
print ${CDHIST[i]}
'cd' ${CDHIST[i]}
else
'cd' $@
fi
;;
-*) # cd to matched dir in list
t=${1#-}
i=1
while ((i<cdlen))
do
case ${CDHIST[i]} in
*$t*)
print ${CDHIST[i]}
'cd' ${CDHIST[i]}
break
;;
esac
((i=i+1))
done
if ((i>=cdlen))
then
'cd' $@
fi
;;
*) # cd to new dir
'cd' $@
;;
esac
_cdins # insert $PWD into cd history
if [ "$CDHISTFILE" ]
then
cdlen=${#CDHIST[*]} # number of elements in history
i=0
while ((i<cdlen))
do
print -r ${CDHIST[i]} # update directory history
((i=i+1))
done >$CDHISTFILE
fi
# set_prompt
return 0
}
function _cdins # insert $PWD into cd history
{ # meant to be called only by _cd
typeset -i i
((i=0))
while ((i<${#CDHIST[*]})) # see if dir is already in list
do
if [ "${CDHIST[$i]}" = "$PWD" ]
then
break
fi
((i=i+1))
done
if ((i>22)) # limit max size of list
then
i=22
fi
while (((i=i-1)>=0)) # bump old dirs in list
do
CDHIST[i+1]=${CDHIST[i]}
done
CDHIST[0]=$PWD # insert new directory in list
}
David Becker beckerd@cs.unc.edu
Technical Details
Message-ID:
<11606@thorin.cs.unc.edu>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!usc!rutgers!mcnc!thorin!grover!beckerdShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!usc!rutgers!mcnc!thorin!grover!beckerd From: beckerd@grover.cs.unc.edu (David Becker) Newsgroups: gnu.bash.bug Subject: complex functions Summary: can bash handle this? Message-ID: <11606@thorin.cs.unc.edu> Date: 23 Jan 90 17:13:30 GMT Sender: news@thorin.cs.unc.edu Reply-To: beckerd@grover.cs.unc.edu (David Becker) Distribution: na Organization: University Of North Carolina, Chapel Hill Lines: 147