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. --- a/src/bltin/printf.c +++ b/src/bltin/printf.c @@ -439,34 +444,12 @@ int echocmd(int argc, char **argv) { - int nonl = 0; - struct output *outs = out1; - - if (!*++argv) - goto end; - if (equal(*argv, "-n")) { - nonl = ~nonl; - if (!*++argv) - goto end; + int i; + for (i = 1; i < argc; ++i) { + outstr(argv[i], out1); + if (i < argc - 1) + outc(' ', out1); } - - do { - int c; - - nonl += conv_escape_str(*argv); - outstr(stackblock(), outs); - if (nonl > 0) - break; - - c = ' '; - if (!*++argv) { -end: - if (nonl) { - break; - } - c = '\n'; - } - outc(c, outs); - } while (*argv); + outc('\n', out1); return 0; } --- a/src/dash.1 +++ b/src/dash.1 @@ -1180,43 +1180,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 .Pp -All other backslash sequences elicit undefined behaviour. +No arguments or backslash sequences are supported as they are not portable. +They will be printed out exactly as passed in. +.Pp +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.