Subject: Re: echo semantics (was ksh need help!)
To: NetBSD User's Discussion List <netbsd-users@NetBSD.ORG>
From: Greg A. Woods <woods@weird.com>
List: netbsd-users
Date: 12/20/2001 17:06:04
[ On Thursday, December 20, 2001 at 12:34:35 (-0000), David Laight wrote: ]
> Subject: Re: echo semantics (was ksh need help!)
>
> There is no 'print' in bourne shell (I've just checked under solaris)
No, and there's not supposed to be, though you can find it in a shell on
Solaris)....
That's why Sun supply the XPG4 commands. /usr/xpg4/bin/sh is supposed
to be a POSIX compliant/compatible shell and it does at least have a
(built-in) 'print' command. Note that /usr/xpg4/bin/sh happens to be a
link to ../../bin/ksh, and even though the version of ksh in most
distributions of Solaris I've looked at isn't entirely 100% POSIX
compliant. (If I'm not mistaken the XPG4 specifications became The
Single UNIX Specification (version 1?) in the change-over of X/Open to
The Open Group. XPG4 was a "brand" trademark used to advertise
compliance with X/Open's specifications, and with the coming of SuSv2
the "brand" trademark changes to "UNIX 98")
NetBSD's implementation of echo, at least as far as the /bin/echo and
/bin/sh built-in are concerned, appears to be P1003.2 compliant in every
way, just as echo(1) claims. No doubt the same applies for printf(1).
P1003.2 (at least as of Draft 12, the last publicly available version),
sanely defines a rather more restricted version of 'echo' than SuSv2.
(SuSv2 frequently strays beyond POSIX, often in what appear to be unwise
ways, but that was always the case with X/Open too.)
4.19 echo - Write arguments to standard output
4.19.1 Synopsis
echo [string ...]
4.19.2 Description
The echo utility shall write its arguments to standard output, followed
by a <newline> character. If there are no arguments, only the <newline>
character shall be written.
4.19.3 Options
The echo utility shall not recognize the -- argument in the manner
specified by utility syntax guideline 10 in 2.10.2; -- shall be
recognized as a string operand.
Implementations need not support any options.
4.19.4 Operands
The following operands shall be supported by the implementation:
string A string to be written to standard output. If the first
operand is "-n" or if any of the operands contain a
backslash (\) character, the results are implementation
defined.
4.19.5 External Influences
4.19.5.1 Standard Input
None.
4.19.5.2 Input Files
None.
4.19.5.3 Environment Variables
The following environment variables shall affect the execution of echo:
LANG This variable shall determine the locale to use for
the locale categories when both LC_ALL and the
corresponding environment variable (beginning with
LC_) do not specify a locale. See 2.6.
LC_ALL This variable shall determine the locale to be used
to override any values for locale categories
specified by the settings of LANG or any
environment variables beginning with LC_.
LC_MESSAGES This variable shall determine the language in which
diagnostic messages should be written.
4.19.5.4 Asynchronous Events
Default.
4.19.6 External Effects
4.19.6.1 Standard Output
The echo utility arguments shall be separated by single <space>s and a
<newline> character shall follow the last argument.
4.19.6.2 Standard Error
Used only for diagnostic messages.
4.19.6.3 Output Files
None.
4.19.7 Extended Description
None.
4.19.8 Exit Status
The echo utility shall exit with one of the following values:
0 Successful completion.
>0 An error occurred.
4.19.9 Consequences of Errors
Default.
BEGIN_RATIONALE
4.19.10 Rationale. (This subclause is not a part of P1003.2)
Examples,_Usage
As specified by this standard, echo writes its arguments in the simplest
of ways. The two different historical versions of echo vary in fatal
incompatible ways.
The BSD echo checks the first argument for the string "-n", which causes
it to suppress the <newline> character that would otherwise follow the
final argument in the output.
The System V echo does not support any options, but allows escape
sequences within its operands:
\a Write an <alert> character.
\b Write a <backspace> character.
\c Suppress the <newline> character that otherwise follows the
final argument in the output. All characters following the \c
in the arguments are ignored.
\f Write a <form-feed> character.
\n Write a <newline> character.
\r Write a <carriage-return> character.
\t Write a <tab> character.
\v Write a <vertical-tab> character.
\\ Write a backslash character.
\0num
Write an 8-bit value that is the 1-, 2-, or 3-digit octal number
num.
It is not possible to use echo portably across these two implementations
unless both -n (as the first argument) and escape sequences are omitted.
The printf utility (see 4.50) can be used to portably emulate any of the
traditional behaviors of the echo utility as follows:
- The System V echo is equivalent to:
printf "%b\n" "$*"
- The BSD echo is equivalent to:
if [ "X$1" = "X-n" ]
then
shift
printf "%s" "$*"
else
printf "%s\n" "$*"
fi
The echo utility does not support utility syntax guideline 10 because
existing applications depend on echo to echo all of its arguments, except
for the -n option in the BSD version.
New applications are encouraged to use printf instead of echo. The echo
utility has not been made obsolescent because of its extremely widespread
use in existing applications.
History_of_Decisions_Made
In Draft 8, an attempt was made to merge the extensions of BSD and
System V, supporting both -n and escape sequences. During initial ballot
resolution, a -e option was proposed to enable the escape conventions.
Both attempts failed, as there are historical scripts that would be
broken by any attempt at reconciliation. Therefore, in Draft 9 only the
simplest version of echo is presented. Implementation-defined extensions
on BSD and System V will keep historical applications content. Portable
applications that wish to do prompting without <newline>s or that could
possibly be expecting to echo a "-n", should use the new printf utility
(see 4.50), derived from the Ninth Edition.
The LC_CTYPE variable is not cited because echo, as specified here, does
not need to understand the characters in its arguments. The System V and
BSD implementations might need to be sensitive to it because of their
extensions.
END_RATIONALE
Copyright c 1991 IEEE. All rights reserved.
This is an unapproved IEEE Standards Draft, subject to change.
P1003.2/D11.2 INFORMATION TECHNOLOGY--POSIX
P1003.2 obviously also defines printf, and gives the following reason
for doing so:
4.50.10 Rationale. (This subclause is not a part of P1003.2)
[[....]]
History_of_Decisions_Made
The printf utility was added to provide functionality that has
historically been provided by echo. However, due to irreconcilable
differences in the various versions of echo extant, the version in this
standard has few special features, leaving those to this new printf
utility, which is based on one in the Ninth Edition at AT&T Bell Labs.
Also note this from P1003.2:
(6) When irreconcilable differences arose between versions of
historical utilities, new interfaces (utility names or syntax)
were sometimes added in their places. The working group
resisted the urge to deviate significantly from historical
practice; the new interfaces are generally consistent with the
philosophy of historical systems and represent comparable
functionality to the interfaces being replaced. In some cases,
System V and BSD had diverged (such as with echo and sum) so
significantly that no compromises for a common interface were
possible. In these cases, either the divergent features were
omitted or an entirely new command name was selected (such as
with printf and cksum).
--
Greg A. Woods
+1 416 218-0098; <gwoods@acm.org>; <g.a.woods@ieee.org>; <woods@robohack.ca>
Planix, Inc. <woods@planix.com>; VE3TCP; Secrets of the Weird <woods@weird.com>