
By default the echo command emits its arguments followed by a line feed.
If any of the arguments contains the sub-string "\c", the line feed is suppressed.
This does not match shells used in Linux and BSD where the first argument has to be -n to suppress the line feed.
The hush shell interferes with the parsing of backslashes. E.g. in the following command line quadruple backslashes are required for suppressing the line feed:
for i in 1 2 3; do for j in 4 5; do echo \\c ${i}${j}; done; echo; done;
To avoid unexpected behavior the patch changes echo to use -n as first argument to suppress the line feed.
Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de --- cmd/echo.c | 49 ++++++++++++++++++------------------------------- 1 file changed, 18 insertions(+), 31 deletions(-)
diff --git a/cmd/echo.c b/cmd/echo.c index d02a4cfd58..fda844ee9d 100644 --- a/cmd/echo.c +++ b/cmd/echo.c @@ -10,47 +10,34 @@ static int do_echo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { - int i; - int putnl = 1; - - for (i = 1; i < argc; i++) { - char *p = argv[i]; - char *nls; /* new-line suppression */ + int i = 1; + bool space = false; + bool newline = true; + + if (argc > 1) { + if (!strcmp(argv[1], "-n")) { + newline = false; + ++i; + } + }
- if (i > 1) + for (; i < argc; ++i) { + if (space) { putc(' '); - - nls = strstr(p, "\c"); - if (nls) { - char *prenls = p; - - putnl = 0; - /* - * be paranoid and guess that someone might - * say \c more than once - */ - while (nls) { - *nls = '\0'; - puts(prenls); - *nls = '\'; - prenls = nls + 2; - nls = strstr(prenls, "\c"); - } - puts(prenls); - } else { - puts(p); } + puts(argv[i]); + space = true; }
- if (putnl) + if (newline) putc('\n');
return 0; }
U_BOOT_CMD( - echo, CONFIG_SYS_MAXARGS, 1, do_echo, + echo, CONFIG_SYS_MAXARGS, 1, do_echo, "echo args to console", - "[args..]\n" - " - echo args to console; \c suppresses newline" + "[-n] [args..]\n" + " - echo args to console; -n suppresses newline" ); -- 2.29.2