guy@rlgvax.UUCP (Guy Harris) (03/06/84)
> The only safe form I know of (for forcing a shell script to be executed > by "sh" and not "csh" - gh) across ALL systems is to write a script that > begins with a space... I believe beginning the script with a colon will also work. For those of you who have tuned in late, all versions of the Bourne shell, even the V7 one, treat the colon as a command which throws away its arguments and returns an "exit status" of 0 (it sort of acts like a comment, but it will parse the text after the colon as arguments to a command, so beware of shell meta-characters), while the C shell treats it as a signal to run the script with "/bin/sh". We've used it on several occasions and it works fine. The 4.xBSD Bourne shell, and some other Bourne shells on systems with "csh", treat a script whose *first character* is "#" as something to be run by "csh" (elsewhere, "#" is just a comment in some Bourne shells), so beginning a script with "#" may fail for one of the three following reasons: 1) Your Bourne shell may think it flags the script as a C shell script; 2) Your Bourne shell may not know the C shell from Adam, but doesn't understand that "#" introduces a comment; 3) You used the "#! /bin/sh" construct to force it to be executed by "/bin/sh", but your system doesn't have the trick (originally concocted by an employee of Bell Labs, by the way) of the "magic number" "#!" introducing an executable file header which indicates the pathname of an interpreter to be used to interpret the contents of the file. Guy Harris {seismo,ihnp4,allegra}!rlgvax!guy
gwyn@brl-vgr.ARPA (Doug Gwyn ) (03/07/84)
I have come to regret trying to help the novices by suggesting a way to get the right command interpreter to execute their shell scripts. The claim that has been repeated most is that if your script does not start with a # character the Bourne shell will execute it is FALSE for the 4.2BSD Cshell. Only under some circumstances does this happen. We have seen scripts staring with : get fed to csh, much to the annoyment of the user. My original suggestion, that Bourne shell scripts start with #!/bin/sh, is completely correct for the following UNIX variants: 4.2BSD 4.2BSD with BRL UNIX System V emulation UNIX System III UNIX System V If you have some other UNIX system, the interesting question is "why?".
donn@hp-dcd.UUCP (03/10/84)
Careful with #!; If you are running csh on a USG UN*X system (System III or V), #! doesn't work. The line #!/bin/sh will then be seen by csh (after the exec fails), treated as a comment, and cause csh to assume that it's a csh script (csh assumes that a file beginning with # is a csh script). System III and V, but not V7, sh treat anything after a # as a comment. The only safe form I know of across ALL systems is to write a script that begins with a space: # This is a /bin/sh script echo hi there If you have #!, then Doug's proposal will work. This applies definitely to 4.1 csh, etc; I havn't tested it against 4.2, but I suspect it still applies. Donn Terry hplabs!hp-dcd!donn
fair@dual.UUCP (Erik E. Fair) (03/11/84)
Correction, Doug: System III and System V do NOT implement #!/bin/sh.
This is found ONLY in 4BSD decescendants
from one who is even now suffering System V,
Erik E. Fair
dual!fair@BERKELEY.ARPA
{ihnp4,ucbvax,cbosgd,decwrl,amd70,fortune,zehntel}!dual!fair
Dual Systems Corporation, Berkeley, Californiaguy@rlgvax.UUCP (Guy Harris) (03/11/84)
When Doug said that "#!/bin/sh" at the beginning of a shell file would force
the shell file to be executed on 4.2BSD, S3, and S5, I think he meant "S3 and
S5 which haven't hacked the Bourne shell Berkeley-style to run scripts which
begin with "#" with the C shell". That hack (having the Bourne shell run
scripts that begin with "#" with the C shell, and having the C shell run
scripts that begin with ":" with the Bourne shell) was done *before* "#"
was allowed as a comment character in Bourne shell scripts. Now that it
*is* allowed, that hack is based on an invalid assumption and should not
be implemented. As such, any *sane* S3/S5 implementation of the Bourne
shell won't feed scripts to the C shell if the script begins with "#".
If you want to have a way to have scripts "select" the shell that they're
to be executed by, the best solution is to bite the bullet and implement
"#!". It's only 236 bytes of code on the VAX (I've pulled the code
out and compiled it!), permits you to implement set-UID shell scripts, and
has been blessed - hell, it was *invented* - by Dennis Ritchie himself.
I know at least one commercial V7 micro-based system with the C shell
implemented the heuristic based on the rule "Bourne shell scripts do not
begin with '#', and C shell scripts do not begin with ':'", which was
true in V7. It's *not* true in S3 or S5, so if anybody puts the C shell
into their USG system they will *break things* if they put that rule into
the Bourne shell. There are Bourne shell scripts *distributed with S3 and
S5* which begin with "#", so don't even *think* about putting that heuristic
in! If you need to put in some way to identify scripts as Bourne or C
shell scripts, *please* send your $600 or whatever it is to the University
of California, get a 4.xBSD tape, and implement "#!".
Guy Harris
{seismo,ihnp4,allegra}!rlgvax!guydave@utcsrgv.UUCP (Dave Sherman) (03/12/84)
~| From: gwyn@brl-vgr.ARPA (Doug Gwyn )
~| ... is completely correct for the following UNIX variants:
~| 4.2BSD
~| 4.2BSD with BRL UNIX System V emulation
~| UNIX System III
~| UNIX System V
~| If you have some other UNIX system, the interesting question is "why?".
Because v7 is simple, standard, portable, and runs on my 11/23.
Dave Sherman
The Law Society of Upper Canada
Toronto
--
{allegra,cornell,decvax,ihnp4,linus,utzoo}!utcsrgv!daveka@hou3c.UUCP (Kenneth Almquist) (03/14/84)
> If you want to have a way to have scripts "select" the shell that they're > to be executed by, the best solution is to bite the bullet and implement > "#!". No need to put it into the kernel, either. It should be easy to hack it into the shell. Kenneth Almquist