[comp.bugs.4bsd] Bug in csh

tytso@athena.mit.edu.UUCP (11/25/87)

Bug:
	When shell builtins bomb out in .logout, the logout is aborted.

Repeat by:
	(don't do this as root :-)

Script started on Tue Nov 24 17:15:42 1987
<tytso@paris>   {/mit/t/y/tytso}, Level 2
1% mv .logout .logout.real
<tytso@paris>   {/mit/t/y/tytso}, Level 2
2% cat >.logout
kill 1
^D
<tytso@paris>   {/mit/t/y/tytso}, Level 2
3% ln -s /bin/csh -
<tytso@paris>   {/mit/t/y/tytso}, Level 2
4% -				<===== Fake a login shell
IBM RT<n>? ^C			<===== Abort login sequenece
<tytso@paris>   {/mit/t/y/tytso}, Level 3
1% logout
1: Not owner
<tytso@paris>   {/mit/t/y/tytso}, Level 3
2% logout
1: Not owner
<tytso@paris>   {/mit/t/y/tytso}, Level 3
3% logout
1: Not owner
<tytso@paris>   {/mit/t/y/tytso}, Level 3
4% logout
1: Not owner
<tytso@paris>   {/mit/t/y/tytso}, Level 3
5% ^D
logout
1: Not owner
<tytso@paris>   {/mit/t/y/tytso}, Level 2
5% ^D

script done on Tue Nov 24 17:16:57 1987

Fix:
*** /source/4.3/bin/tcsh/sh.c   Sat Nov 21 23:02:31 1987
--- sh.c        Tue Nov 24 17:35:21 1987
***************
*** 697,702 ****
--- 697,703 ----
  goodbye()
  {
        rechist();
+       child++;                /* On errors, DIE! */
        if (loginsh) {
                (void) signal(SIGQUIT, SIG_IGN);
  #ifdef COMPAT42



	

jonathan@cs.keele.ac.uk (Jonathan Knight) (11/23/88)

Os:	Ultrix 1.2A
Bug:	The csh dirs command is documented as producing an
	abbreviated output form using ~ unless the -l option
	is used.  However if `dirs` is used the full path name
	is returned without the -l option.

Example:
	% dirs
	~
	% dirs -l
	/fs/cs/jonathan
	% echo `dirs`
	/fs/cs/jonathan
	% echo `dirs -l`
	/fs/cs/jonathan

	echo `dirs` should have produced ~.
-- 
  _____      Jonathan Knight,               || JANET:  jonathan@uk.ac.keele.cs
    /        Department of Computer Science || UUCP:   ...!ukc!kl-cs!jonathan
   / _   __  University of Keele, Keele,    || BITNET: jonathan%cs.kl.ac.uk@
(_/ (_) / /  Staffordshire.  ST5 5BG.  U.K. || ----------------  ukacrl.bitnet

jonathan@cs.keele.ac.uk (Jonathan Knight) (11/23/88)

In article <428@kl-cs.UUCP>, jonathan@cs.keele.ac.uk (Jonathan Knight) writes:
> Bug:	The csh dirs command is documented as producing an
> 	abbreviated output form using ~ unless the -l option
> 	is used.  However if `dirs` is used the full path name
> 	is returned without the -l option.
> 	% echo `dirs`
> 	/fs/cs/jonathan
> 	echo `dirs` should have produced ~.

Ooops.  The dirs command does produce the ~ output, but it is expanded
into /fs/cs/jonathan by the shell.
	% echo "`dirs`"
	~
The expansion is suppressed by putting "'s around the `dirs`.
-- 
  _____      Jonathan Knight,               || JANET:  jonathan@uk.ac.keele.cs
    /        Department of Computer Science || UUCP:   ...!ukc!kl-cs!jonathan
   / _   __  University of Keele, Keele,    || BITNET: jonathan%cs.kl.ac.uk@
(_/ (_) / /  Staffordshire.  ST5 5BG.  U.K. || ----------------  ukacrl.bitnet

chris@mimsy.UUCP (Chris Torek) (11/24/88)

In article <428@kl-cs.UUCP> jonathan@cs.keele.ac.uk (Jonathan Knight) writes:
>Bug:	The csh dirs command is documented as producing an
>	abbreviated output form using ~ unless the -l option
>	is used.  However if `dirs` is used the full path name
>	is returned without the -l option.

This is not the case.

>Example:
>	% dirs
>	~
>	% echo `dirs`
>	/fs/cs/jonathan
>
>	echo `dirs` should have produced ~.

But

	% echo ~

would produce

	/fs/cs/jonathan

and not

	~

The text returned from backquote expansion is re-globbed unless
quoted (or `noglob' is set).  After

	% set noglob

the commands

	% echo ~
	% echo `dirs`
	% unset noglob
	% echo "`dirs`"

all produce

	~
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain:	chris@mimsy.umd.edu	Path:	uunet!mimsy!chris

dvk@sei.cmu.edu (Daniel Klein) (04/26/91)

Well, here's an interesting one! Try typing:

% echo hello & while (1)
? end

The "echo hello" gets executed at each loop of the while.  A similar bug
does not exist with foreach, though.

-- ============ -- =========== -- =========== -- =========== -- =========== --
"The only thing that separates us from the animals is superstition and
mindless rituals" (Latke)      Daniel Klein	CMU-SEI   +1 412/268-7791
						dvk@sei.cmu.edu

rbj@uunet.UU.NET (Root Boy Jim) (04/26/91)

In article <24610@as0c.sei.cmu.edu> dvk@sei.cmu.edu (Daniel Klein) writes:
>
>Well, here's an interesting one! Try typing:
>
>% echo hello & while (1)
>? end
>
>The "echo hello" gets executed at each loop of the while.  A similar bug
>does not exist with foreach, though.

You should know better than to try this. Csh is intrinsicly broken.
Anyway, it's not a bug, it's a feature. It's documented:

	The foreach, switch, and while statements, as well as the
	if-then-else form of the if statement require that the major
	keywords appear in a single simple command on an input line
	as shown below.

Sun says it better:

	Each occurrence of a foreach, switch, while,  if...then  and
	else built-in must appear as the first word on its own input line.

BTW, don't try piping to them or I/O redirection either.

Another broken feature: for integer values of X & Y try:

	(repeat X repeat Y echo foo) | wc -l

What is printed is not X*Y, but rather X+Y-1.

No one cares enuf to fix csh.

-- 
		[rbj@uunet 1] stty sane
		unknown mode: sane