summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-shells/dash/files/dumb-echo.patch')
-rw-r--r--app-shells/dash/files/dumb-echo.patch103
1 files changed, 103 insertions, 0 deletions
diff --git a/app-shells/dash/files/dumb-echo.patch b/app-shells/dash/files/dumb-echo.patch
new file mode 100644
index 00000000..89d51096
--- /dev/null
+++ b/app-shells/dash/files/dumb-echo.patch
@@ -0,0 +1,103 @@
+http://bugs.gentoo.org/337329
+http://bugs.gentoo.org/527848
+http://bugs.gentoo.org/590696
+
+There's no requirement for `echo` to support escape sequences on systems
+which are not XSI compliant (like embedded systems) according to POSIX:
+http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
+
+This behavior breaks historical scripts, espcially if also the (not required
+by POSIX) `echo -n` and `echo -e` are unsupported, in particular all scripts
+generated by autoconf-2.13 will break.
+
+Modern scripts better should avoid all these pitfalls and should always prefer
+`printf` when they want anything like `echo -n` or interpretation of escape
+sequences. So it might be useful to intentionally break scripts which rely on
+these features. Note that this patch makes `echo` in dash behave differently
+from any other existing shell.
+
+--- a/src/bltin/printf.c
++++ b/src/bltin/printf.c
+@@ -442,21 +442,12 @@
+ int
+ echocmd(int argc, char **argv)
+ {
+- int nonl;
+-
+- nonl = *++argv ? equal(*argv, "-n") : 0;
+- argv += nonl;
+-
+- do {
+- int c;
+-
+- if (likely(*argv))
+- nonl += print_escape_str("%s", NULL, NULL, *argv++);
+- if (nonl > 0)
+- break;
+-
+- c = *argv ? ' ' : '\n';
+- out1c(c);
+- } while (*argv);
++ int i;
++ for (i = 1; i < argc; ++i) {
++ outstr(argv[i], out1);
++ if (i < argc - 1)
++ outc(' ', out1);
++ }
++ outc('\n', out1);
+ return 0;
+ }
+--- a/src/dash.1
++++ b/src/dash.1
+@@ -1182,43 +1182,18 @@
+ option turns off the effect of any preceding
+ .Fl P
+ options.
+-.It Xo echo Op Fl n
++.It Xo echo
+ .Ar args...
+ .Xc
+ Print the arguments on the standard output, separated by spaces.
+-Unless the
+-.Fl n
+-option is present, a newline is output following the arguments.
+-.Pp
+-If any of the following sequences of characters is encountered during
+-output, the sequence is not output. Instead, the specified action is
+-performed:
+-.Bl -tag -width indent
+-.It Li \eb
+-A backspace character is output.
+-.It Li \ec
+-Subsequent output is suppressed. This is normally used at the end of the
+-last argument to suppress the trailing newline that
+-.Ic echo
+-would otherwise output.
+-.It Li \ef
+-Output a form feed.
+-.It Li \en
+-Output a newline character.
+-.It Li \er
+-Output a carriage return.
+-.It Li \et
+-Output a (horizontal) tab character.
+-.It Li \ev
+-Output a vertical tab.
+-.It Li \e0 Ns Ar digits
+-Output the character whose value is given by zero to three octal digits.
+-If there are zero digits, a nul character is output.
+-.It Li \e\e
+-Output a backslash.
+-.El
+ .Pp
+-All other backslash sequences elicit undefined behaviour.
++In this crippled version of dash no backslash sequences are supported.
++They will be printed out exactly as passed in.
++Also the option -n is not supported in this crippled version of dash.
++.Pp
++Moderns scripts might want to replace `echo -n ...` with the `printf %s ...`
++construct, and similarly use `printf` to for escape sequences. This is POSIX
++compliant though not compatible since some historical systems lack `printf`.
+ .It eval Ar string ...
+ Concatenate all the arguments with spaces.
+ Then re-parse and execute the command.