| 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.9.1/src/bltin/printf.c |
| +++ dash-0.5.9.1/src/bltin/printf.c |
| @@ -449,21 +449,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 (likely((nonl + !*argv) > 1)) |
| - 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; |
| } |
| --- dash-0.5.9.1/src/dash.1 |
| +++ dash-0.5.9.1/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. |