That's exactly what you should get using System V "echo".
This is one of those annoying gratuitous incompatibilities among UNIX
variants. Some time ago I proposed a transition plan, whereby the
Berkeley variant of "echo" would accept -e for System V-style escape
interpretation (as in 9th Ed. UNIX), the System V variant would accept
"-e" but do nothing new, System V shell scripts would be searched for
cases where recognizing the first non-option argument as an option if
it looked like one would cause problems when new options were added to
"echo", and fixing those cases to allow addition of new options, then
another transition phase during which -e options would be added to any
usage that requires \-interpretations, and finally replacing both the
System V and BSD "echo"s with a common version that accepts options in
accordance with the Command Syntax Standard (including "--"), does no
\-escape interpretation unless the -e option is specified, and handles
-n the old Berkeley (7th Edition UNIX, actually) way. It would take a
few years to make this transition, and nobody has been trying to fix
it so far as I can see. One would think that 1003.2 would get this
straightened out, but as a practical matter we need more than just a
final standard spec for "echo", we also need a viable transition plan.
I did wait some days to see if somebody else would mention ...
now it seems to be my turn:
Note also, that SysV Rel 3 introduces the -n option again to mean "no
linefeed". The \c-convention lives on, the programmer has the choice.
It seems, that AT&T just waited long enough to cause many programmers
headaches how to convert existing scripts and to invent `portable'
solutions, and - with the `XENIX compatibility' - the "-n"-option
slipped back into SysV.
BTW: Everyone who wants to read more about how to supress echo's newline
should take a look to "The UNIX Programming Environment" by Kernighan&Pike,
page 79 -- you'll find a nice little tale there ....
--
Martin Weitzel, email: mar...@mwtech.UUCP, voice: 49-(0)6151-6 56 83
>... deleted stuff relating to the imcompatability of System V versus
>Berkeley echo
>variants. Some time ago I proposed a transition plan, whereby the
>Berkeley variant of "echo" would accept -e for System V-style escape
>interpretation (as in 9th Ed. UNIX), the System V variant would accept
>"-e" but do nothing new, System V shell scripts would be searched for
>... some more arguments deleted
I have a better idea - why not just build an echo that understands all the
Berkeley and System V stuff? I don't like the idea of adding another switch
to a widely used program that puts you into "System V mode" or some such.
It becomes too tempting to do the same thing to all the other incompatible
commands.
--
Thomas V. Frauenhofer ...!rutgers!rochester!kodak!swamps!!frau!tvf *or*
...!uunet!atexnet!kodak!swamps!frau!tvf (tvf@frau, tvf@cci632)
"What's a gourmand? I'll tell you, he's a P-I-G pig!"
- Justin Wilson
It's been done. See PD2:<UNIX-C.UTILS>ECHO.TAR-Z in the UNIX-SW archives
on WSMR-SIMTEL20.ARMY.MIL (do the FTP in "tenex" mode, not "image" or
"binary" mode). It's written by David MacKenzie <e...@rocky2.rockefeller.edu>.
It's also in the comp.sources archives somewhere; check your copy of the
index.
Dave Curry
UNIX-SW Moderator
DCU...@WSMR-SIMTEL20.ARMY.MIL
I'll give you that point, but I still feel that a transition "echo" will add
to the confusion.
I'll refine my point - Why not just build an echo that supports as many of
both the System V and Berkeley features as possible? Where there are
conflicts (such as noted above), let's get some "Smart Group of People" (a
UNIX standards committee? :-) ) choose one (going into real dangerous ground
here: strikes me that the biggest pain with the two echos is the '-n' versus
'\c' problem, and as other people have noted, echos have been implemented
that support both).
Because the behaviors are incompatible! How should
why bother?
when I want to
echo 'foo\n'
I do
printf "foo\n"
and get exactly what I want.
printf is Chris Torek's work, comp.sources.unix volume 9 I think.
--Ed
No, that's exactly what isn't wanted - what's wanted is an echo
that supports none of the BSD (ie: V7) or Sys V "features".
Echo should simply send its arg characters to stdout, no interpretation,
no additions, no deletions, no changes (I will accept adding a space
between the args, but that's it, and its not necessary).
With that, anything is possible, any other scheme causes complications.
The V7 echo is liveable, you simply always use "echo -n ..." and it
does just what is wanted - its just a bit silly to have to explicitly
give the -n all the time.
Using a Sys V echo try to do
var='some string containing \n which is two characters not one'
echo "$var"
and have it actually print the two characters \ and n ... nb: you can't
alter the definition of "var" in a real application, it wouldn't be
a constant, but something obtained from a file, or read from the user.
Then go look at every sh script on Sys V that uses "echo" and see
how many of them contain this kind of potential bug.
kre
ps: if you want echo to add a '\n' (one character), you just do ...
nl='
'
echo 'whatever'"$nl"
(or include the newline in the "whatever" whichever is easier). Similarly
for other characters that Sys V \ sequences in echo give you. If you're
really doing report formatting (with lots of this stuff) use Chris Torek's
printf, which is much better suited.
The last thing in the world you should want to do is to get one of the
UNIX standardization committees involved in specifying this! In fact
IEEE 1003.2 seems to have tried, and ended up specifying a totally
different facility with a different name etc. instead!
To anyone who really cares about a common version of "echo", there's
not much question about how it SHOULD work (answer: like the one in
9th Edition UNIX, but using getopt to fully support the Command Syntax
Standard). The problem is all those shell scripts that would break if
"echo" were changed. I had some experience with this when we started
using a SVR2-based shell in place of the horrible one shipped with
4.3BSD; the kernel build procedure failed due to relying on "echo \n"
producing two characters (apart from the final newline), not one as
the built-in System V-compatible "echo" did. (The BRL Bourne shell
now has an option so that it can be compiled with 7th Edition UNIX
"echo" semantics built in in place of USG 3.0 "echo" semantics.)
I have a public-domain implementation of the combined (V9-like) "echo"
utility that I could post if people really want to risk breaking their
applications by installing it. I don't recommend this..
Having contributed to this mess, long ago, and far away (by instigating
some of the \ escapes in PWB-land), I observe the following:`
1) In well over 10 years, the situation has not gotten appreciably
better, as anything called echo that doesn't work like the echo you like,
is guaranteed to break things. This is despite valiant handstands
from numerous people trying to combine things in upward-compatible ways.
2) The only way I can imagine fixing this, at this point, is:
a) <Somebody> define a command that:
contains the union of functionality of all echoes ever used,
even if it breaks immediate upward compatibility.
i.e., there has to at least be some way to say everything
you need, even if you ahve to say it differently.
It would be pleasant if easy editign scripts existed to
convert, though.
b) Call this command ech, or emit, or out, or anything....
c) Provide a public domain version.
d) Have many vendors include it in their distributions.
e) Get it into the various shells as builtins, where sensible.
f) Start converting scripts to use it, at leisure.
g) Sometime, the old echo can be marked "deprecated", or whatever
the right term is.
IF this were started in 1990 (i.e.,a-c), one migtht see d) and e)
by late 1991, early 1992, and it could be in SVR5, perhaps.
f) would get going seriously in 1992/1993.
Step g) could probably happen around 1995 or 1996.
BTW: this was serious, not a joke.... getting rid of a command
is REAL HARD....
--
-john mashey DISCLAIMER: <generic disclaimer, I speak for me only, etc>
UUCP: {ames,decwrl,prls,pyramid}!mips!mash OR ma...@mips.com
DDD: 408-991-0253 or 408-720-1700, x253, or 408-524-7015
USPS: MIPS Computer Systems, 930 E. Arques, Sunnyvale, CA 94086
>BTW: this was serious, not a joke.... getting rid of a command
>is REAL HARD....
Which is, (I think) the point. Being a stoic, I have resigned myself
to using:
if echo "\c" | grep c >/dev/null
then Dn="-n"; Sc=""
else Dn=""; Sc="\c"
fi
...
echo $Dn "Oh, brother, what a pain$Sc"
- Rich Geiger
Ultra Network Technologies / 101 Daggett Drive / San Jose CA 95134
r...@ultra.com ...!ames!ultra!rmg (408) 922-0100 [w] (408) 739-7911 [h]
--
- Rich Geiger
Ultra Network Technologies / 101 Daggett Drive / San Jose CA 95134
r...@ultra.com ...!ames!ultra!rmg (408) 922-0100 [w] (408) 739-7911 [h]
I agree. The command that we're hoping will do this little trick is
printf(1). Printf is exactly what you think it is, a command level
printf(3). I've attached a freely redistributable version and manual
page. Printf(1) is derived from Eighth Edition and is in SVID 3 and
4.4BSD. POSIX (the IEEE UNIX standard) 1003.2, while still in draft
version, also includes it.
Incidentally, for those people advocating that the Sys V and BSD echo's
be rolled into one larger, more powerful echo, forget it. The POSIX
1003.2 group fought this one out in about 5 different cities over a
year and a half. Given that they're incompatible *before* the various
"features" get used, it just isn't going to happen.
--keith
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# printf.1
# printf.c
#
echo x - printf.1
sed 's/^X//' >printf.1 << 'END-of-printf.1'
X.\" Copyright (c) 1989 The Regents of the University of California.
X.\" All rights reserved.
X.\"
X.\" Redistribution and use in source and binary forms are permitted
X.\" provided that the above copyright notice and this paragraph are
X.\" duplicated in all such forms and that any documentation,
X.\" advertising materials, and other materials related to such
X.\" distribution and use acknowledge that the software was developed
X.\" by the University of California, Berkeley. The name of the
X.\" University may not be used to endorse or promote products derived
X.\" from this software without specific prior written permission.
X.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X.\"
X.\" @(#)printf.1 5.5 (Berkeley) 2/16/89
X.\"
X.TH PRINTF 1 "February 16, 1989
X.AT 1
X.SH NAME
Xprintf \- formatted output
X.SH SYNOPSIS
X.PP
X.B printf format [ arguments ... ]
X.SH DESCRIPTION
X.I Printf
Xformats and prints its arguments, after the first, under control
Xof the
X.IR format .
XThe
X.I format
Xis a character string which contains three types of objects: plain characters,
Xwhich are simply copied to standard output, character escape sequences which
Xare converted and copied to the standard output, and format specifications,
Xeach of which causes printing of the next successive
X.IR argument .
X.PP
XThe
X.I arguments
Xafter the first are treated as strings if the corresponding format is
Xeither
X.I c
Xor
X.IR s ;
Xotherwise it is evaluated as a C constant, with the following extensions:
X.in +0.5i
XA leading plus or minus sign is allowed.
X.br
XIf the leading character is a single or double quote, or not a digit,
Xplus, or minus sign, the value is the ASCII code of the next character.
X.in -0.5i
X.PP
XThe format string is reused as often as necessary to satisfy the
X.IR arguments .
XAny extra format specifications are evaluated with zero or the null
Xstring.
X.PP
XCharacter escape sequences are in backslash notation as defined in the
Xdraft proposed ANSI C Standard X3J11. The characters and their meanings
Xare as follows:
X.TP
X.B \ea
XWrite a <bell> character.
X.TP
X.B \eb
XWrite a <backspace> character.
X.TP
X.B \ef
XWrite a <form-feed> character.
X.TP
X.B \en
XWrite a <new-line> character.
X.TP
X.B \er
XWrite a <carriage return> character.
X.TP
X.B \et
XWrite a <tab> character.
X.TP
X.B \ev
XWrite a <vertical tab> character.
X.TP
X.B \e'
XWrite a <single quote> character.
X.TP
X.B \e\e
XWrite a backslash character.
X.TP
X.B \enum
XWrite an 8-bit character whose ASCII value is the 1-, 2-, or 3-digit
Xoctal number
X.IR num .
X.PP
XEach format specification is introduced by the percent character
X(``%'').
XThe remainder of the format specification includes, in the
Xfollowing order:
X.TP
X.B \(bu
XZero or more of the following flags:
X.RS
X.TP
X.B \(bu
Xa `#' character
Xspecifying that the value should be printed in an ``alternate form''.
XFor
X.BR c ,
X.BR d ,
Xand
X.BR s ,
Xformats, this option has no effect. For the
X.B o
Xformats the precision of the number is increased to force the first
Xcharacter of the output string to a zero. For the
X.BR x ( X )
Xformat, a non-zero result has the string
X.BR 0x ( 0X )
Xprepended to it. For
X.BR e ,
X.BR E ,
X.BR f ,
X.BR g ,
Xand
X.BR G ,
Xformats, the result will always contain a decimal point, even if no
Xdigits follow the point (normally, a decimal point only appears in the
Xresults of those formats if a digit follows the decimal point). For
X.B g
Xand
X.B G
Xformats, trailing zeros are not removed from the result as they
Xwould otherwise be;
X.TP
X.B \(bu
Xa minus sign `\-' which specifies
X.I "left adjustment"
Xof the output in the indicated field;
X.TP
X.B \(bu
Xa `+' character specifying that there should always be
Xa sign placed before the number when using signed formats.
X.TP
X.B \(bu
Xa space specifying that a blank should be left before a positive number
Xfor a signed format. A `+' overrides a space if both are used;
X.TP
X.B \(bu
Xa zero `0' character indicating that zero-padding should be used
Xrather than blank-padding. A `\-' overrides a `0' if both are used;
X.RE
X.TP
X.B \(bu
Xan optional digit string specifying a
X.I "field width;"
Xif the output string has fewer characters than the field width it will
Xbe blank-padded on the left (or right, if the left-adjustment indicator
Xhas been given) to make up the field width (note that a leading zero
Xis a flag, but an embedded zero is part of a field width);
X.TP
X.B \(bu
Xan optional period, followed by an optional digit string giving a
X.I precision
Xwhich specifies the number of digits to appear after the decimal point,
Xfor e- and f-formats, or the maximum number of characters to be printed
Xfrom a string; if the digit string is missing, the precision is treated
Xas zero;
X.TP
X.B \(bu
Xa character which indicates the type of format to use.
X.PP
XA field width or precision may be `*' instead of a digit string.
XIn this case an
X.I argument
Xsupplies the field width or precision.
X.PP
XThe format characters and their meanings are:
X.TP
X.B diouXx
XThe
X.I argument
Xis printed as a signed decimal (d or i), unsigned decimal, unsigned octal,
Xor unsigned hexadecimal (X or x), respectively.
X.TP
X.B f
XThe
X.I argument
Xis printed in the style `[\fB\-\fR]ddd.ddd' where the number of d's
Xafter the decimal point is equal to the precision specification for
Xthe argument.
XIf the precision is missing, 6 digits are given; if the precision
Xis explicitly 0, no digits and no decimal point are printed.
X.TP
X.B eE
XThe
X.I argument
Xis printed in the style `[\fB\-\fR]d\fB.\fRddd\fBe\fR\(+-dd' where there
Xis one digit before the decimal point and the number after is equal to
Xthe precision specification for the argument; when the precision is
Xmissing, 6 digits are produced.
XAn upper-case E is used for an `E' format.
X.TP
X.B gG
XThe
X.I argument
Xis printed in style
X.B f
Xor in style
X.B e
X.RB ( E )
Xwhichever gives full precision in minimum space.
X.TP
X.B c
XThe first character of
X.I argument
Xis printed.
X.TP
X.B s
XCharacters from the string
X.I argument
Xare printed until the end is reached or until the number of characters
Xindicated by the precision specification is reached; however if the
Xprecision is 0 or missing, all characters in the string are printed.
X.TP
X.B %
XPrint a `%'; no argument is used.
X.PP
XIn no case does a non-existent or small field width cause truncation of
Xa field; padding takes place only if the specified field width exceeds
Xthe actual width.
X.SH "RETURN VALUE"
X.IR Printf
Xexits 0 on success, 1 on failure.
X.SH "SEE ALSO"
Xprintf(3)
X.SH BUGS
XSince the number is translated from ASCII to floating-point, and
Xthen back again, floating-point precision may be lost.
X.PP
XANSI hexidecimal character constants were deliberately not provided.
END-of-printf.1
echo x - printf.c
sed 's/^X//' >printf.c << 'END-of-printf.c'
X/*
X * Copyright (c) 1989 The Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by the University of California, Berkeley. The name of the
X * University may not be used to endorse or promote products derived
X * from this software without specific prior written permission.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X */
X
X#ifndef lint
Xchar copyright[] =
X"@(#) Copyright (c) 1989 The Regents of the University of California.\n\
X All rights reserved.\n";
X#endif /* not lint */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)printf.c 5.7 (Berkeley) 7/20/89";
X#endif /* not lint */
X
X#include <sys/types.h>
X#include <stdio.h>
X
X#define PF(f, func) { \
X if (fieldwidth) \
X if (precision) \
X (void)printf(f, fieldwidth, precision, func); \
X else \
X (void)printf(f, fieldwidth, func); \
X else if (precision) \
X (void)printf(f, precision, func); \
X else \
X (void)printf(f, func); \
X}
X
Xchar **gargv;
X
Xmain(argc, argv)
X int argc;
X char **argv;
X{
X static char *skip1, *skip2;
X register char *format, *fmt, *start;
X register int end, fieldwidth, precision;
X char convch, nextch, *getstr(), *index(), *mklong();
X double getdouble();
X long getlong();
X
X if (argc < 2) {
X fprintf(stderr, "usage: printf format [arg ...]\n");
X exit(1);
X }
X
X /*
X * Basic algorithm is to scan the format string for conversion
X * specifications -- once one is found, find out if the field
X * width or precision is a '*'; if it is, gather up value. Note,
X * format strings are reused as necessary to use up the provided
X * arguments, arguments of zero/null string are provided to use
X * up the format string.
X */
X skip1 = "#-+ 0";
X skip2 = "*0123456789";
X
X escape(fmt = format = *++argv); /* backslash interpretation */
X gargv = ++argv;
X for (;;) {
X end = 0;
X /* find next format specification */
Xnext: for (start = fmt;; ++fmt) {
X if (!*fmt) {
X /* avoid infinite loop */
X if (end == 1) {
X fprintf(stderr,
X "printf: missing format character.\n");
X exit(1);
X }
X end = 1;
X if (fmt > start)
X (void)printf("%s", start);
X if (!*gargv)
X exit(0);
X fmt = format;
X goto next;
X }
X /* %% prints a % */
X if (*fmt == '%') {
X if (*++fmt != '%')
X break;
X *fmt++ = '\0';
X (void)printf("%s", start);
X goto next;
X }
X }
X
X /* skip to field width */
X for (; index(skip1, *fmt); ++fmt);
X fieldwidth = *fmt == '*' ? getint() : 0;
X
X /* skip to possible '.', get following precision */
X for (; index(skip2, *fmt); ++fmt);
X if (*fmt == '.')
X ++fmt;
X precision = *fmt == '*' ? getint() : 0;
X
X /* skip to conversion char */
X for (; index(skip2, *fmt); ++fmt);
X if (!*fmt) {
X fprintf(stderr, "printf: missing format character.\n");
X exit(1);
X }
X
X convch = *fmt;
X nextch = *++fmt;
X *fmt = '\0';
X switch(convch) {
X case 'c': {
X char p = getchr();
X PF(start, p);
X break;
X }
X case 's': {
X char *p = getstr();
X PF(start, p);
X break;
X }
X case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
X char *f = mklong(start, convch);
X long p = getlong();
X PF(f, p);
X break;
X }
X case 'e': case 'E': case 'f': case 'g': case 'G': {
X double p = getdouble();
X PF(start, p);
X break;
X }
X default:
X fprintf(stderr, "printf: illegal format character.\n");
X exit(1);
X }
X *fmt = nextch;
X }
X /* NOTREACHED */
X}
X
Xchar *
Xmklong(str, ch)
X char *str, ch;
X{
X int len;
X char *copy, *malloc();
X
X len = strlen(str) + 2;
X if (!(copy = malloc((u_int)len))) { /* never freed; XXX */
X fprintf(stderr, "printf: out of memory.\n");
X exit(1);
X }
X bcopy(str, copy, len - 3);
X copy[len - 3] = 'l';
X copy[len - 2] = ch;
X copy[len - 1] = '\0';
X return(copy);
X}
X
Xescape(fmt)
X register char *fmt;
X{
X register char *store;
X register int value, c;
X
X for (store = fmt; c = *fmt; ++fmt, ++store) {
X if (c != '\\') {
X *store = c;
X continue;
X }
X switch (*++fmt) {
X case '\0': /* EOS, user error */
X *store = '\\';
X *++store = '\0';
X return;
X case '\\': /* backslash */
X case '\'': /* single quote */
X *store = *fmt;
X break;
X case 'a': /* bell/alert */
X *store = '\7';
X break;
X case 'b': /* backspace */
X *store = '\b';
X break;
X case 'f': /* form-feed */
X *store = '\f';
X break;
X case 'n': /* newline */
X *store = '\n';
X break;
X case 'r': /* carriage-return */
X *store = '\r';
X break;
X case 't': /* horizontal tab */
X *store = '\t';
X break;
X case 'v': /* vertical tab */
X *store = '\13';
X break;
X /* octal constant */
X case '0': case '1': case '2': case '3':
X case '4': case '5': case '6': case '7':
X for (c = 3, value = 0;
X c-- && *fmt >= '0' && *fmt <= '7'; ++fmt) {
X value <<= 3;
X value += *fmt - '0';
X }
X --fmt;
X *store = value;
X break;
X default:
X *store = *fmt;
X break;
X }
X }
X *store = '\0';
X}
X
Xgetchr()
X{
X if (!*gargv)
X return((int)'\0');
X return((int)**gargv++);
X}
X
Xchar *
Xgetstr()
X{
X if (!*gargv)
X return("");
X return(*gargv++);
X}
X
Xstatic char *number = "+-.0123456789";
Xgetint()
X{
X if (!*gargv)
X return(0);
X if (index(number, **gargv))
X return(atoi(*gargv++));
X return(asciicode());
X}
X
Xlong
Xgetlong()
X{
X long atol();
X
X if (!*gargv)
X return((long)0);
X if (index(number, **gargv))
X return(atol(*gargv++));
X return((long)asciicode());
X}
X
Xdouble
Xgetdouble()
X{
X double atof();
X
X if (!*gargv)
X return((double)0);
X if (index(number, **gargv))
X return(atof(*gargv++));
X return((double)asciicode());
X}
X
Xasciicode()
X{
X register char ch;
X
X ch = **gargv;
X if (ch == '\'' || ch == '"')
X ch = (*gargv)[1];
X ++gargv;
X return(ch);
X}
END-of-printf.c
exit
% printf "%d\n" 010
and it printed "10" rather than "8".
I think it would be more intuitive (and useful) for the radix to be chosen
based upon a leading "0" or "0x". [This could be accomplished by using
strtol(*gargv++, 0) instead of atol() in getlong().] If it is too late to
change the functionality of the program, then I suggest the wording in the
manual page be changed to indicate that integer constants are always
considered to be decimal.
--
John Bruner Center for Supercomputing R&D, University of Illinois
bru...@uicsrd.csrd.uiuc.edu (217) 244-4476
Perhaps not....
>but I'll put my two cents in anyway. The documentation says that the
>arguments are evaluated as C constants (if the format is not 'c' or 's')
>with a mechanism for obtaining character codes.
SVID Third Edition (does anybody else find the "Edition" in its name an
amusing harkening back to older days?) says:
It fully supports conversion specifications for strings
(%s descriptor); however, the results are undefined for the
other conversion specifications [see printf(BA_LIB)].
so, while "printf(BA_CMD)" is in SVID 3, its behavior when any
format other than 's' is specified is not.
I believe that this has already happened, within the Korn shell - it is
called (if I remember correctly) print, and it supports echo as a function
that maps into print.
| b) Call this command ech, or emit, or out, or anything....
| c) Provide a public domain version.
| d) Have many vendors include it in their distributions.
| e) Get it into the various shells as builtins, where sensible.
| f) Start converting scripts to use it, at leisure.
| g) Sometime, the old echo can be marked "deprecated", or whatever
| the right term is.
|
|IF this were started in 1990 (i.e.,a-c), one migtht see d) and e)
|by late 1991, early 1992, and it could be in SVR5, perhaps.
|f) would get going seriously in 1992/1993.
|Step g) could probably happen around 1995 or 1996.
That takes care of a-b. Anyone want to tackle c now? Any manufacturers
want to tackle d-e? Any standards committees want to aim the ball while
it is still just starting to roll?
--
Algol 60 was an improvment on most | John Macdonald
of its successors - C.A.R. Hoare | jmm@eci386