csh misconceptions

rml at hp-dcd.UUCP rml at hp-dcd.UUCP
Tue Mar 20 13:02:00 AEST 1984


Suppose  I run csh as my login  shell on a  non-Berkeley  system,  and I
execute a script beginning with

#!/bin/sh

The following steps (as you have outlined) will occur:

>> (1)  The kernel is asked to execv() it.  One of two things can happen:
>> 
>> 	(a)  If the script starts with #!progname etc. then the kernel
>> 	arranges for the script to be attached to the standard input of
>> 	the specified program, typically /bin/sh or /bin/csh, which
>> 	takes it from there.

1b applies only to Berkeley systems; it does not apply here, so we continue to

>> 
>> 	(b)  Otherwise, the execv() returns to the Cshell with an
>> 	ENOEXEC error indication.
>>
>> (2)  If there is an alias defined for "shell", then the Cshell will
>> prepend that to the command and try another execv().

The person who has aliased shell has taken control over which shell will
be executed  away from the script.  This  requires a specific  action on
the part of that person.  Assume this is not the case.

>> (3)  Otherwise, if the first character of the script is a # character,
>> the shell specified in the "shell" environment variable is prepended,
>> or if there is none specified "/bin/csh" is used.  This would usually
>> be /bin/csh for most Cshell users.  The resulting command is execv()ed.

This is the case which takes place.  Since this is a login shell, Cshell
has set its "shell" environment varibale to /bin/csh.  The script, which
begins #!/bin/sh, is thus fed to the Cshell.

>> >From the above, it is clear that the ONLY way to ensure that a Bourne
>> shell script is interpreted by /bin/sh as intended is to supply the
>> first line
>> 
>> 	#!/bin/sh

>From this  example,  I state  that the ONLY way to ensure  that a Bourne
shell script is  interpreted by /bin/sh as intended is to supply a first
character which is not #.  The #!program is  counterproductive  not only
for backward  compatibility  with versions of sh which don't recognize #
as a comment  character, but for  compatibility  with non-Berkeley  UN*X
systems.  I generally write Bourne shell scripts with a first line like:

:  this is a Bourne shell script not a Cshell script

If someone does invoke this script from the Cshell with shell aliased to
/bin/csh, the Cshell will complain  about the first line.  It recognizes
:  as a goto label, but does not allow it to have arguments.

Because : is not a true comment character, beware of lines like

:  don't invoke with csh

				Bob Lenk
				{hplabs, inhp4}!hpfcla!rml



More information about the Comp.unix mailing list