[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Proposed new POSIX sh policy



On Wed November 15 2006 18:15, Russ Allbery wrote:
> Bruce Sass <bmsass@shaw.ca> writes:
> > On Wed November 15 2006 16:45, Russ Allbery wrote:
> >> No, but Policy currently requires scripts that use features not
> >> available from POSIX to declare an appropriate shell, and POSIX
> >> doesn't guarantee the binary -a operator.
> >
> > Since all sh's in Debian provide compatible binary -a operators,
> > #!/bin/sh is appropriate when that operator is used and Policy is
> > not being violated.  Ya?
>
> I suppose you could read it that way, but I think that's strained.
>
>     The standard shell interpreter /bin/sh can be a symbolic link to
> any POSIX compatible shell, if echo -n does not generate a
> newline.[59] Thus, shell scripts specifying /bin/sh as interpreter
> must only use POSIX features. If a script requires non-POSIX features
> from the shell interpreter, the appropriate shell must be specified
> in the first line of the script (e.g., #!/bin/bash) and the package
> must depend on the package providing the shell (unless the shell
> package is marked "Essential", as in the case of bash).
>
> I'd rather make the situation clearer.

No doubt. I've always thought that, historically, "sh" was a Bourne 
shell... ignore history at your own peril.

> > I don't see why scripts would need to change. I can see how mention
> > of -a in Policy could be considered as cruft, but it would serve to
> > identify -a as a requirement, in addition to POSIX, which any
> > command interperter in Debian purporting to be "sh" needs to abide
> > by... is that what you are trying to get clarified?
>
> Yup!

I can understand Debian wanting to be POSIX compliant and dictating 
that /bin/sh be POSIX compliant, but it is an error to say that any 
POSIX compatible shell is a "sh". e.g., pdksh claims to be POSIX 
compatible and it may be appropriate to allow it to link to /bin/ksh, 
but surely it would not be proper to link pdksh to /bin/sh even though 
Korn claims to be Bourne compatible.

AFAICT, "/bin/sh can be a symbolic link to any POSIX compatible shell" 
does not really convey what Debian wants, it would be better to state 
that, `only POSIX features should be used in Debian "sh" scripts', 
followed by a list of exceptions (which would presumably be a subset of 
those features in common use which exist in all shells allowed to 
be "sh".)

So, maybe something like:
-----
Scripts specifying /bin/sh as their command interpreter (shell) must 
only use SUSv3[1] features or the following exceptions:

- echo -n    [2]
- [ x -a y ] [3]
- ...        [4]

Thus, the only shells allowed to be /bin/sh are those which are SUSv3 
compliant and implement the allowed exceptions to SUSv3. If a script 
requires non-SUSv3 features not explicitly excepted, the appropriate 
shell must be specified in the first line of the script (e.g., 
#!/bin/bash) and the package must depend on the package providing the 
shell (unless the shell package is marked "Essential", as in the case 
of bash).

[1] http://www.opengroup.org/onlinepubs/009695399/ POSIX, XSI, whatever
[2] whatever its problem is
[3] why -a is allowed
[4] justification as to why or why not
-----

I think the above text has the advantage of being clearer about what is 
expected of scripts, after all, it is the scripts that are important 
and the shells can be anything able to properly interpret them. It also 
puts any exceptions to the desired conformance in a list separated from 
the main text, which allows for easy modification and serves as a quick 
reference of things which need to be eliminated for compliance to be 
achieved.

The exceptions can be crossed off and their justification deleted as 
they become irrelevant without altering the text itself, eventually 
ending up with something like:
-----
Scripts specifying /bin/sh as their command interpreter (shell) must 
only use SUSv3[1] features. Thus, the only shells allowed to be /bin/sh 
are those which are SUSv3 compliant. If a script requires non-SUSv3 
features, the appropriate shell must be specified in the first line of 
the script (e.g., #!/bin/bash) and the package must depend on the 
package providing the shell (unless the shell package is 
marked "Essential", as in the case of bash).

[1] http://www.opengroup.org/onlinepubs/009695399/ POSIX, XSI, whatever
-----

Thanks for your time, and HTH.


- Bruce



Reply to: