|
|
|
http://bugs.gentoo.org/337329
|
|
|
|
http://bugs.gentoo.org/527848
|
|
|
|
|
|
|
|
there's no requirement for `echo` to support escape sequences. bash, by default,
|
|
|
|
does not, while dash always does. POSIX permits either behavior:
|
|
|
|
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
|
|
|
|
|
|
|
|
however, since the behavior is not portable, no one should be relying on echo
|
|
|
|
having any specific behavior. they should use `printf` when they want an escape
|
|
|
|
sequence. it also makes dash smaller & faster to disable this logic entirely.
|
|
|
|
|
|
|
|
--- dash-0.5.10/src/bltin/printf.c
|
|
|
|
+++ dash-0.5.10/src/bltin/printf.c
|
|
|
|
@@ -457,22 +457,13 @@
|
|
|
|
int
|
|
|
|
echocmd(int argc, char **argv)
|
|
|
|
{
|
|
|
|
- const char *lastfmt = snlfmt;
|
|
|
|
- int nonl;
|
|
|
|
+ int i;
|
|
|
|
|
|
|
|
- if (*++argv && equal(*argv, "-n")) {
|
|
|
|
- argv++;
|
|
|
|
- lastfmt = "%s";
|
|
|
|
+ for (i = 1; i < argc; ++i) {
|
|
|
|
+ outstr(argv[i], out1);
|
|
|
|
+ if (i < argc - 1)
|
|
|
|
+ outc(' ', out1);
|
|
|
|
}
|
|
|
|
-
|
|
|
|
- do {
|
|
|
|
- const char *fmt = "%s ";
|
|
|
|
- char *s = *argv;
|
|
|
|
-
|
|
|
|
- if (!s || !*++argv)
|
|
|
|
- fmt = lastfmt;
|
|
|
|
-
|
|
|
|
- nonl = print_escape_str(fmt, NULL, NULL, s ?: nullstr);
|
|
|
|
- } while (!nonl && *argv);
|
|
|
|
+ outc('\n', out1);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
--- dash-0.5.10/src/dash.1
|
|
|
|
+++ dash-0.5.10/src/dash.1
|
|
|
|
@@ -1182,43 +1182,15 @@
|
|
|
|
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
|
|
|
|
+No arguments or backslash sequences are supported as they are not portable.
|
|
|
|
+They will be printed out exactly as passed in.
|
|
|
|
.Pp
|
|
|
|
-All other backslash sequences elicit undefined behaviour.
|
|
|
|
+You can replace `echo -n ...` with the portable `printf %s ...` construct.
|
|
|
|
.It eval Ar string ...
|
|
|
|
Concatenate all the arguments with spaces.
|
|
|
|
Then re-parse and execute the command.
|