.
Last update: 1997-05-20
9945-2-20
_____________________________________________________________________________
Topic: sh
Relevant Sections: 3.9.1.1, 4.56.4
Defect Report:
-----------------------
In Section 2.2.2.57, the standard defines an ``executable
file'' as ``a regular file acceptable as a new process image
by the equivalent of the POSIX.1 exec family of functions.''
[Draft 12 of ISO/IEC 9945-2:1993 (July 1992), p. 21, lines
450-451]
In the definition of PATH in Section 2.6 - Environment
Variables, the standard states that ``[t]he list shall be
searched from beginning to end [...] until an executable
file with the specified name and appropriate execution
permissions is found.'' [Ibid., p. 78, lines 2705-2708]
In Section 3.9.1.1 - Command Search and Execution, the
standard describes the method for locating a simple command,
possibly ``using the PATH environment variable as described
in 2.6,'' [Ibid., p. 141, lines 775-776], and then states:
If the execve() function fails due to an error
equivalent to the POSIX.1 {8} error [ENOEXEC], the
shell shall execute a command equivalent to having
a shell invoked with the command name as its first
operand, along with any remaining arguments passed
along. If the executable file is not a text file,
the shell may bypass this command execution, write
an error message, and return an exit status of
126.
[Ibid., p. 142, lines 787-794, and lines 810-815]
So, following the reference into Section 4.56.4 - Operands
{of sh}, the standard states:
If the pathname contains one or more slash
characters, the implementation shall attempt to
read that file; the file need not be executable.
If the pathname does not contain a slash
characters:
- The implementation shall attempt to read that
file from the current working directory; the
file need not be executable.
[Ibid., p. 437, lines 8907-8912]
Now, there is no requirement in POSIX.1 that exec() can
necessarily run shell scripts (using the #! interpreter
convention). Thus, text files containing a list of commands
to pass to the shell, commonly referred to as ``shell
scripts,'' may not be executable according to Section
2.2.2.57. If a ``simple command,'' as defined in Section
3.9.1.1 is actually a shell script, it will not be
executable, so it will be invoked as if a command_file in
Section 4.56.4, even if its execution permission bits are
not set. Only Section 2.6 deals with the permission bits,
and then only for executable files.
To remedy this problem, can the phrase ``executable file''
be interpreted in Sections 2.6, 3.9.1.1, and 4.56.4 as also
including shell scripts with the execute bits set?
Otherwise, shell scripts never need to have their execute
bits set, contrary to historical practice.
WG15 response for 9945-2:1993
-----------------------------------
The standard clearly states the requirements for appropriate execution
permissions and conforming implementations must conform to this.
If the appropriate execute permission bit is not set
then the process image file does not have appropriate access
permission.
ISO/IEC 9945-1:1990 specifies the ENOEXEC error for the execve()
function as being returned if the file does have the
appropriate permissions but is not a process image, and the EACCESS
error as being returned if the file does not have the appropriate
permissions.
Hence if the file does not have the appropriate execute bit set
EACCESS is returned and no attempt to execute the file as a shell
script will result.
Rationale for Interpretation:
-----------------------------
None.
Recirculated for 30 day review: Oct 19 1995
Finalised: Nov 20 1995