trost@reed.bitnet (Bill Trost) (12/20/89)
The noise on alt.sources.wanted about file reversal made me come up with this little program: #!/local/bin/bash # Yes, all through this I should be using "$@", but that's for version # 1.05 (I have 1.04) rv () { [ $# = 0 ] && { # Call this block A local line=empty\?\?\? read line || return echo Read: "$line" 2>&1 rv echo "$line" # end A return } # Call this block B local f=$1 shift [ $# = 0 ] || rv $* rv < $f } rv $* Now, if I run this with no arguments (using /etc/motd as stdin), it works on the Decstation and longjmp botches after echoing "empty" on the Vax. If I run it with one argument, it does a longjmp botch after echoing "empty" on either machine. Then, if I swap blocks A and B and change the "&&" to a "||", with no arguments it works on the DECstation, but it prints "empty" for the first line and never prints the first line of the file (which should be printed last). Of course, Chet has probably already fixed it.... :-)
bfox@sbphy.ai.mit.edu (Brian Fox) (12/21/89)
Date: 19 Dec 89 23:46:35 GMT From: tektronix!reed!trost@cis.ohio-state.edu (Bill Trost) Sender: bug-bash-request@prep.ai.mit.edu The noise on alt.sources.wanted about file reversal made me come up with this little program: #!/local/bin/bash # Yes, all through this I should be using "$@", but that's for version # 1.05 (I have 1.04) rv () { [ $# = 0 ] && { # Call this block A local line=empty\?\?\? read line || return echo Read: "$line" 2>&1 rv echo "$line" # end A return } # Call this block B local f=$1 shift [ $# = 0 ] || rv $* rv < $f } rv $* Now, if I run this with no arguments (using /etc/motd as stdin), it works on the Decstation and longjmp botches after echoing "empty" on the Vax. If I run it with one argument, it does a longjmp botch after echoing "empty" on either machine. Then, if I swap blocks A and B and change the "&&" to a "||", with no arguments it works on the DECstation, but it prints "empty" for the first line and never prints the first line of the file (which should be printed last). Of course, Chet has probably already fixed it.... :-) Probably! But on the off chance that he hasn't, could you send me a typescript of the session? Thanks, Brian
trost%REED.BITNET@MITVMA.MIT.EDU (12/21/89)
Heh, this should cover it. This was run on the DECstation --- which now seems to be running differently than when I first posted about this. bash$ cat /etc/motd Ultrix Worksystem V2.0 (Rev. 7) System #1: Tue Aug 29 22:41:48 EDT 1989 I would encourage everyone to not rlogin to this machine from the DECstations to do things, but instead do stuff from the machine you're on. If that is impossible for some reason, fix it, or send mail to trost repeatedly (but not too often) until he does. bash$ ./rv /etc/motd Read: Ultrix Worksystem V2.0 (Rev. 7) System #1: Tue Aug 29 22:41:48 EDT 1989 Read: I would encourage everyone to not rlogin to this machine from the DECstati Read: to do things, but instead do stuff from the machine you're on. If that is Read: impossible for some reason, fix it, or send mail to trost repeatedly (but Read: too often) until he does. empty??? longjmp botch bash$ ./rv < /etc/motd Read: Ultrix Worksystem V2.0 (Rev. 7) System #1: Tue Aug 29 22:41:48 EDT 1989 Read: I would encourage everyone to not rlogin to this machine from the DECstati Read: to do things, but instead do stuff from the machine you're on. If that is Read: impossible for some reason, fix it, or send mail to trost repeatedly (but Read: too often) until he does. empty??? longjmp botch bash$ ./gurk < /etc/motd Read Ultrix Worksystem V2.0 (Rev. 7) System #1: Tue Aug 29 22:41:48 EDT 1989 Read I would encourage everyone to not rlogin to this machine from the DECstatio Read to do things, but instead do stuff from the machine you're on. If that is Read impossible for some reason, fix it, or send mail to trost repeatedly (but n Read too often) until he does. empty??? too often) until he does. impossible for some reason, fix it, or send mail to trost repeatedly (but not to do things, but instead do stuff from the machine you're on. If that is I would encourage everyone to not rlogin to this machine from the DECstations bash$ ./gurk /etc/motd Read Ultrix Worksystem V2.0 (Rev. 7) System #1: Tue Aug 29 22:41:48 EDT 1989 Read I would encourage everyone to not rlogin to this machine from the DECstatio Read to do things, but instead do stuff from the machine you're on. If that is Read impossible for some reason, fix it, or send mail to trost repeatedly (but n Read too often) until he does. empty??? too often) until he does. impossible for some reason, fix it, or send mail to trost repeatedly (but not to do things, but instead do stuff from the machine you're on. If that is I would encourage everyone to not rlogin to this machine from the DECstations longjmp botch bash$ cat rv rv () { [ $# = 0 ] && { # Call this block A local line=empty\?\?\? read line || return echo Read: "$line" 2>&1 rv echo "$line" # end A return } # Call this block B local f=$1 shift [ $# = 0 ] || rv $* rv < $f } rv $* bash$ cat gurk #!/local/bin/bash rv () { [ $# = 0 ] || { local f=$1 shift [ $# = 0 ] || rv $* rv < $f return 0 } local line=empty\?\?\? read line || return echo Read "$line" 2>&1 rv echo "$line" } rv $* bash$ set _=/etc/motd OLDPWD=/bassoon/u/ss/trost EUID=236 UID=236 HISTSIZE=500 HISTFILE=/u/ss/trost/.bash_history BASH_VERSION=0.00.4 PWD=/tmp MAILCHECK=60 IFS= PS2=bash> PS1=bash\$ VISUAL=/bin/ed USER=trost TTY=ttyp3 TEXINPUTS=.:/u/ss/trost/lib/tex:/usr/lib/tex/macros TEXEDIT=/bin/ed TERM=emacs SHLVL=2 SHELL=/local/bin/bash RNINIT=-i1 -T -hReferences -hMessage-Id -hlines -e -d/u/ss/trost/.news PRINTER=katy PATH=/u/ss/trost/.bin/vishnu:/u/ss/trost/.bin:/local/bin:/local/bin/xclients:/us PAGER=less MAIL=/u/ss/trost/.mail/inbox:/u/ss/trost/.mail/root:/u/ss/trost/.mail/twatch:/et LESS=sMqtwp JOVERC=/u/ss/trost/.joverc HUNT=name=default,mapkey=;G HOST=vishnu HOME=/u/ss/trost EDITOR=/bin/ed DISPLAY=bassoon:0 COLS=22 BASH=/local/bin/bash TERMCAP=emacs:co#80:tc=unknown: EMACS=t bash$
trost@reed.bitnet (Bill Trost) (12/21/89)
#!/local/bin/bash
# Yes, all through this I should be using "$@", but that's for version
# 1.05 (I have 1.04)
rv () {
[ $# = 0 ] && {
# Call this block A
local line=empty\?\?\?
read line || return
echo Read: "$line" 2>&1
rv
echo "$line"
# end A
return
}
...
By the way, someone should probably add this to the Official
Collection of Shell Scripts Which Severely Bash on Bash.
Gads, I haven't even *tried* to reverse /etc/termcap --- yet.
chet@cwns1.CWRU.EDU (Chet Ramey) (12/21/89)
In article <13771@reed.UUCP> trost@reed.bitnet (Bill Trost) writes: [another neat script, this one for reversing files] >Of course, Chet has probably already fixed it.... :-) Yup, and I sent the fix to Brian again today (just for good measure :-). If anyone's interested, it has to do with using a single global jump_buf to implement `return' with longjmp. This obviously screws recursive functions or functions that call other functions; the first function to call `return' gets the right jump_buf and leaves all the others in the twilight zone (I've seen `main' get re-executed on my IBM RT running 4.3 for a really pathological case). Chet Ramey -- Chet Ramey Network Services Group "Where's my froggie?" Case Western Reserve University chet@ins.CWRU.Edu
chet@cwns1.CWRU.EDU (Chet Ramey) (12/21/89)
In article <8912201910.AA16864@.reed.bitnet> trost%REED.BITNET@MITVMA.MIT.EDU writes: >bash$ cat rv > rv () { > [ $# = 0 ] && { > # Call this block A > local line=empty\?\?\? I seem to have not fixed this completely, or maybe I'm just confused. I did fix the longjmp botch problem, but I don't think this line is doing what everyone thinks it should be doing. The `local' part works simply because rv is a function, and you can declare local variables in a function. The `{' doesn't really begin a new block with a separate context; on the contrary, it guarantees that the block will be executed in the *current* shell, with the *current* context. Anyway, I don't think it should work as written. This isn't C. (If everyone else thinks otherwise, I'm pretty sure I have a fix for it. But I'm just not convinced that it ever should have worked.) Chet Ramey -- Chet Ramey Network Services Group "Where's my froggie?" Case Western Reserve University chet@ins.CWRU.Edu
chet@cwns1.CWRU.EDU (Chet Ramey) (12/21/89)
In article <1989Dec21.013833.6811@usenet.ins.cwru.edu> I wrote: [Stupidity. Mind-boggling stupidity. Cursed be NNTP and fast article propogation. Gawd, it's embarassing] I have fixed the bug, and I will send the fix to Brian. Here's what I get now: usenet$ type rv rv is a function rv () { [ $# = 0 ]&& { local line=empty\?\?\?; read line|| return; echo Read: "$line" 2>&1 ; rv; echo "$line"; return; }; local f=$1; shift; [ $# = 0 ]|| rv $*; rv <$f ; } usenet$ rv ~/foo Read: 1 Read: 2 Read: 3 Read: 4 Read: 5 5 4 3 2 1 It required changing a single line of code. Funny how this one hasn't hit before; *all* instances of functions executing `return' have always had this bug. Chet Ramey -- Chet Ramey Network Services Group "Where's my froggie?" Case Western Reserve University chet@ins.CWRU.Edu