ARG_MAX
| Shells
| whatshell
| portability
| permissions
| UUOC
| ancient
| -
| ../Various
| HOME
"$@"
| echo/printf
| set -e
| test
| tty defs
| tty chars
| $()
vs )
| IFS
| using siginfo
| nanosleep
| line charset
| locale
I am glad to have found the following in the
CSRG Archive CD-ROMs.
The following was released under the licenses of
BSD and
Caldera.
Here are extracts from 4.2BSD /usr/src/sys/sys/kern_exec.c (link to TUHS Unix Tree)
(emphasis concerning the issue whether a blank after #!
is required)
/* kern_exec.c 6.2 83/08/23 */ [...] execve() { [...] /* * Read in first few bytes of file for segment sizes, ux_mag: * 407 = plain executable * 410 = RO text * 413 = demand paged RO text * Also an ASCII line beginning with #! is * the file name of a ``shell'' and arguments may be prepended * to the argument list if given here. * * SHELL NAMES ARE LIMITED IN LENGTH. * * ONLY ONE ARGUMENT MAY BE PASSED TO THE SHELL FROM * THE ASCII LINE. */ [...] switch (u.u_exdata.ux_mag) { [...] default: if (u.u_exdata.ux_shell[0] != '#' || u.u_exdata.ux_shell[1] != '!' || indir) { u.u_error = ENOEXEC; goto bad; } cp = &u.u_exdata.ux_shell[2]; /* skip "#!" */ while (cp < &u.u_exdata.ux_shell[SHSIZE]) { if (*cp == '\t') *cp = ' '; else if (*cp == '\n') { *cp = '\0'; break; } cp++; } if (*cp != '\0') { u.u_error = ENOEXEC; goto bad; } cp = &u.u_exdata.ux_shell[2]; while (*cp == ' ') cp++; u.u_dirp = cp; while (*cp && *cp != ' ') cp++; sharg = NULL; if (*cp) { *cp++ = '\0'; while (*cp == ' ') cp++; if (*cp) { bcopy((caddr_t)cp, (caddr_t)cfarg, SHSIZE); sharg = cfarg; } } [...]